2009-07-15 8 views
26

Ho fatto C per circa 20 anni ma non ho mai creato una DLL; Ho sempre preferito collegare staticamente.Come creare una DLL dalla riga di comando in Windows utilizzando MSVC

Uso la riga di comando - cl.exe, ecc. E gnumake makefiles, per creare le mie applicazioni Windows.

Ora voglio creare una DLL e sono confuso.

In definitiva, finirò con un .lib e un .dll. Il .lib contiene il codice stub che in fase di esecuzione carica la DLL e utilizza il codice in esso.

Ho osservato le righe di comando per lib e link e non è chiaro per me esattamente cosa si debba fare per produrre questo output.

Quindi ho alcune domande;

Il cl ha bisogno di ulteriori argomenti, per indicare che si sta compilando per una DLL? (So ​​che i prototipi esportati dalla DLL hanno bisogno di __declspec (dllexport)).

So che link ha bisogno di/dll come argomento.

Eseguire il collegamento lib e, per produrre rispettivamente .lib e .dll o collegare entrambi i prodotti?

Cos'altro devo sapere?

+2

Questo post del blog è semplice e mostra anche 'cty accesso pesen da python: http://albertech.blogspot.com/2014/12/how-to-compile-dll-using-clexe.html – jar

risposta

3

Si scopre che succede automaticamente.

Se sono state esportate funzioni (ad es./Export, __declspec (dllexport), ecc.) Il linker genererà automaticamente il file .lib (ovviamente è necessario/dll sulla riga di comando del linker).

+0

infatti, è meglio utilizzare un file delle definizioni dei moduli, perché questo consente di utilizzare prototipi senza __declspec (dllexport), che a sua volta permette di utilizzare il file di intestazione originale del dll voi 'hooking –

0

Il modo più semplice per scoprirlo è creare un progetto MSVC in cui si imposta tutto come si desidera, quindi attivare la registrazione di build, creare una build e analizzare il buildlog per tutti i comandi e i relativi argomenti.

+1

Sì. Tuttavia, ciò comporterà l'installazione della GUI MSVC, che richiederà un periodo di tempo non trascurabile e quasi certamente avrà bisogno della mia attuale configurazione di configurazione del sistema; e tutto ciò semplicemente per creare un singolo progetto in modo da poter esaminare i file di progetto. –

+0

Vero, ma non puoi essere più preciso di così. Se utilizzi una VM non dovrai svestire nulla, ma sì, ci vuole ancora più tempo. :) Saluti, Sebastiaan –

30

In caso di utilizzo della riga di comando:

cl.exe /LD <files-to-compile> 

o, se si preferisce la più prolisso & versione esplicita:

cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll 
+0

Grazie - non è possibile conoscere i "_D" che Windows si aspetta, senza usare MSVC per creare un progetto. –

+2

IMHO, '_USRDLL' e' _WINDLL' non sono necessari, basta usare '/ LD' senza passare'/DLL', '/ OUT' al linker per'/link'. – nn0p

+0

kudos vai a @ nn0p - hai trovato l'opzione * documented * reale per fare la compilazione a-DLL con cl; la "soluzione" originale di Ebow Halm sembra una rozza modulazione nel confronto IMO. – vaxquis

1
cl

ha bisogno di alcun argomenti aggiuntivi, per indicare che sta compilando per una DLL? (So ​​che i prototipi esportati dalla DLL hanno bisogno di __declspec (dllexport)).

Non da Win3x andato via, ora basta solo bisogno di uno o di un file __declspec(dllexport) DEF che definisce i nomi dei simboli che si desidera esportati. un file .def consente di esportare simboli con nomi modificati, quindi può comunque essere utile per casi speciali.

So che link ha bisogno di/dll come argomento.

Sì.

eseguirò lib e link, per produrre rispettivamente .lib e .dll o collegherò entrambi?

lib viene utilizzato solo per creare librerie statiche (o per aggiungere alla vostra .objs IMPLIB) link si produrre sia un .dll ed un Lib importazione per esso.

2

Simlar alla risposta di Ebow Halm, ma utilizzando un file .def della messa in vendita le funzioni esportate e le più recenti argomenti della riga di comando:

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def 

Riferimenti: