2015-08-01 73 views
10

Possiedo Visual Studio 2008, Windows7 64 bit.Come creare librerie statiche e dinamiche da file .obj per Visual C++?

Sto utilizzando la libreria grafica WinBGIm.

Questa libreria viene fornita con alcuni file .obj. Non ci sono file .lib o .dll.

Voglio convertirli in file .lib e dinamici .dll statici.

Ho copiato tutti i file obj nella directory:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64 

Ma, il seguente comando non funziona:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64>lib.exe /out:bgiout.lib *.obj 
Microsoft (R) Library Manager Version 9.00.21022.08 
Copyright (C) Microsoft Corporation. All rights reserved. 

LINK : fatal error LNK1104: cannot open file 'bgiout.lib' 

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64> 

come fare?

+1

Creare un progetto. Aggiungi i file al progetto. La linea di comando è molto meglio però. –

+0

Questo perché non hai impostato correttamente le variabili env. –

+1

Per creare un .lib, utilizzare lib.exe. –

risposta

17

Sì, puoi farlo, praticamente come lo hai tu.

C:\Code\bgi\obj>lib /out:libbgi.lib *.obj 

LIB (lib.exe) viene utilizzato per creare librerie statiche. LINK (link.exe /DLL) viene utilizzato per creare librerie dinamiche (crea il file .dll e una libreria di importazione .lib).

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj [additional libs] 

Quando si utilizza il comando link /DLL, ulteriore Win32 e C++ standard di librerie di runtime sarà richiesto (come MSVCRT.lib e User32.lib ecc e librerie MFC).

In questo caso; questo sembra essere il corretto argomento del linker;

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj MSVCRTD.lib User32.lib Gdi32.lib ole32.lib Comdlg32.lib OleAut32.lib 

Nota: i file oggetto costruite sono le versioni di debug, quindi MSVCRTD.lib (nota D) è quella di usare qui. Con i comandi sopra, sono riuscito a collegare sia un file .dll che un file .lib statico.

Ulteriori percorsi di inclusione e libreria;

Quando si distribuiscono queste uscite per altre build, potrebbe essere necessario includere ulteriori intestazione e percorsi di libreria nella build di destinazione. Per aggiungere ulteriori percorsi ai percorsi di ricerca di inclusione e libreria, è possibile aggiungere le variabili di ambiente (INCLUDE e LIB) (per utente o per esteso al sistema), ma possono anche essere specificate sulla riga di comando, tramite /I e /LIBPATH come segue ;

cl /IC:\Code\include [additional options] main.cpp 
link /LIBPATH:C:\Code\lib [additional options] xyz.lib 

Linee guida;

  • Avviare un prompt dei comandi di "Visual Studio", dato 2008, ci dovrebbe essere un collegamento nel menu di avvio "Prompt dei comandi di Visual Studio 2008". Questo file batch imposterà l'ambiente corretto per una compilazione C++. Assicurati di abbinare la toolchain corretta per i target x86 o x64.
  • Passare alla directory che contiene i file oggetto.
  • Esegui il/i comando/i che hai (come sopra).

tuo errore LNK1104

ho il sospetto l'errore che hai, LNK1104, è molto probabilmente perché l'utente non dispone di autorizzazioni sufficienti per essere la scrittura di file all'interno della directory "Programmi". Altrimenti, potrebbe essere un errore utilizzare la toolchain non corretta per il tuo target (x86 vs x64).

In genere è meglio farlo in una directory personale; ad es .: "C: \ Code \ bgi".

+0

Sì, avevi ragione, riguardava il permesso e la selezione dello strumento. Prima di assegnarti la taglia, puoi dirmi come distribuire i file lib in modo da non dover includere intestazioni C++ come '#include" graphics.h "' ?? Invece voglio scrivere '#include ', o, almeno, '#include '. – anonymous

+1

@ anonimo. Non sono sicuro di cosa intendi per distribuire la lib. Il file di intestazione è necessario al momento della compilazione durante la compilazione. I file lib sono necessari al momento del collegamento nella build, non in fase di runtime sulla macchina di destinazione. La DLL sarebbe necessaria in fase di runtime. Il file header normalmente non contiene nient'altro che le definizioni richieste per il codice in lib o dll (essenzialmente questa sarebbe la dichiarazione di classe e funzione, non qualsiasi codice) ... – Niall

+1

Se è necessario distribuire la lib per altre persone a costruire contro la DLL, quella lib di importazione include abbastanza codice per collegarsi all'exe per caricare la DLL e correggere i puntatori di funzione. La differenza tra '" "' e la forma '<> di include va a come il preprocessore localizza il file di intestazione. '<>' esamina il percorso di inclusione e '" "cerca il file localmente - il nome del file non ha molta importanza - è solo per convenzione. Se distibuting lib e header per la costruzione, allora '<>' probabilmente sarebbe meglio ... – Niall

1

I compilatori C++ moderni incorporeranno informazioni sulle librerie di cui hanno bisogno. Per Visual Studio, un file .obj include un riferimento alle librerie C++ su cui si basa (/ MT/MD/MTd/MDd) queste librerie hanno implementazioni leggermente diverse e non sono compatibili con esse. L'unica scelta è quella di avere il codice sorgente, o più file .obj per ogni modalità build supportata