2010-04-17 13 views
9

Attualmente ho un progetto di console che crea un file .exe; Voglio anche creare un file .lib in modo che altri progetti, compilati come DLL, siano in grado di chiamare funzioni dal progetto originale.Come posso creare sia un file .lib che un file .exe in Visual C++?

So che è possibile, ma non sono riuscito a trovare il modo di farlo. Come faccio a dire al linker di collegare anche un .lib?

risposta

8

In generale non è possibile - le librerie statiche e gli eseguibili sono tipi di animali completamente diversi. Il modo per gestire questa situazione è creare due progetti, uno per la libreria, che contiene tutte le funzionalità. e uno per l'eseguibile, che è un involucro sottile che chiama semplicemente funzioni nella libreria.

+0

Ma proprio qui ho un file vcproj che termina con un exe e una lib ... Eppure per la vita di me non riuscivo a trovare ciò che faceva lo fa http://svn.corecraft.org/aspire_mirror/trunk/win/VC90/hearthstone-world.vcproj – MoshiBin

+0

@Spidey Presumibilmente il progetto contiene due sotto-progetti. –

+0

concordato. Fai in modo che il progetto exe dipenda dal progetto lib e verrà automaticamente ricompilato quando necessario. –

0

Non si "collega anche una lib", si crea un progetto di libreria statica. Quest'ultimo non chiama il linker - invece compila tutti i tuoi file con cl /c e combina i risultanti .obj s in una lib usando lib.exe.

2

Se qualsiasi simbolo in un progetto di applicazione (.exe) viene esportato (ad esempio con __declspec (dllexport)), sia il file .exe e Lib saranno generati See: Why does my Visual C++ .exe project build create .lib and .exp files?

+0

Questo è corretto w.r.t. la domanda nel titolo.Tuttavia, come questo potrebbe aiutare con l'altra domanda nel corpo; "essere in grado di chiamare le funzioni dal progetto [EXE] originale"? – MSalters

+0

Si collega al file .lib generato; l'exe si comporta come una DLL. cioè i simboli sono caricati in runtime dall'exe. –

+0

Ho testato ciò che ho scritto nell'ultimo commento. A volte funziona e talvolta non funziona, un errore "Impossibile inizializzare l'applicazione (0xC0000005)". Utilizzo di LoadLibrary e GetProcAddress Ho anche problemi di memoria. Quindi in realtà non so come usare correttamente il .lib generato. –

11

questo distacco solo come riferimento so che il post originale è stato pubblicato molto tempo fa, ma questo vale ancora per chiunque abbia bisogno di una soluzione a questo problema.

Vai al progetto che si vuole fare un file LIB e attenersi alla seguente procedura:

  1. Fare clic destro sul progetto.
  2. Selezionare Proprietà.
  3. Seleziona Costruisci eventi.
  4. Seleziona evento pre-link.
  5. Infine nella riga di comando incolla questo:

    @ECHO ON @ECHO "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj" "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj"

Questa chiamerà lo strumento lib per generare il file lib fuori i file oggetto generati.

+0

Un po 'di ritardo, ma volevo ringraziarti comunque :) Mi hai reso la vita molto più semplice –

+0

Prego. ;) –

+0

Nel mio caso la localizzazione predefinita per .obj era nella cartella del progetto, quindi ho cambiato "$ (IntermediateOutputPath) *. Obj" in "$ (SolutionDir) $ (ProjectName) \ $ (Configuration) \ *. Obj" . funziona bene, grazie. – elarmando

0

È incredibile il numero di contributori che insiste con arroganza su una risposta errata, quando loro semplicemente non conoscono la risposta.

per generare un lib associato al tuo posto exe la seguente riga nel pre-Link evento:

"$ (VC_ExecutablePath_x86) \ LIB.EXE"/out: "$ (OutDir) $ (ProjectName) .lib "" $ (IntermediateOutputPath) *. obj "

+0

Questa tecnica sembra funzionare solo in modalità Debug. – user6664090

Problemi correlati