Perché ho bisogno di un file obj * durante il collegamento statico?
-
23-08-2019 - |
Domanda
Non sono sicuro perché è questo. Sto distribuendo un lib statica * su più progetti, ma questo lib statica genera molti file * obj. Sembra che ho bisogno di distribuire anche i file * obj con l'* lib. In caso contrario, ottengo questo errore:
1>LINK : fatal error LNK1181: cannot open input file 'nsglCore.obj'
Perché è questo? C'è un modo per includere i dati nei file * obj nella * Lib? Forse un interruttore nel compilatore?
Questa è la mia configurazione per la libreria statica:
C / C ++
/Od /GT /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /MD /Yu"stdafx.hpp" /Fp"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\nsglCore-Win32-Release.pch" /Fo"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
Librarian
/OUT:"e:\Development\Projects\nsGameLib\Source\Core\Output\nsglCore-Win32-Release.lib" /NOLOGO /LTCG
Questa è la mia configurazione per il progetto utilizzando la libreria statica:
C / C ++
/O2 /Oi /I "E:\Development\Projects\nsGameLib\Samples\\DummyEngine\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
Linker
/OUT:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Output\SampleOnlyCore-Win32-Release.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"E:\Development\Projects\nsGameLib\Samples\..\Deployment\Libraries" /MANIFEST /MANIFESTFILE:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT nsglCore kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
Soluzione
Credo che la linea del linker non è corretta. La biblioteca dovrebbe avere un suffisso .lib
su di esso. Così nsglCore
dovrebbe essere nsglCore-Win32-Release.lib
o forse nsglCore-$(TargetPlatform)-$(ConfigurationName).lib
o qualunque sia il corretto macro espansione è.
Altri suggerimenti
In generale, librerie statiche fanno non di generare file oggetto. Quello che fai è creare file oggetto e metterli in una libreria, poi il linker cercherà i file oggetto in quelle librerie.
Mi spiego da un punto riga di comando Unixy di vista dato che è il più semplice da understande (non ho idea di che cosa fa macchinazioni VS prima di fare le cose di base).
Una riga di comando di esempio per la creazione di un eseguibile è:
gcc -c -o prog.o prog.c
gcc -o prog prog.o -L/libdir -lstdc
La prima riga crea semplicemente un file oggetto dal file C
. La seconda riga crea l'eseguibile tirando file oggetto insieme, in genere a seguito di una serie di regole come:
- Tutti i file di
.o
elencato in modo esplicito sono collegati. - Una volta fatto, si cerca le librerie per altri oggetti che soddisfino fa riferimento-ma-undefined simboli.
Per esempio, dire la vostra prog.c
conteneva il printf("hello\n");
linea. Che hanno portato nel file prog.o
che contiene un riferimento a printf
che non è ancora soddisfatto.
Il linker cercherà le librerie specificate fino a quando non soddisfa quel riferimento. In questo caso si cercherà tutti i file del modulo /libdir/libstdc.ext
dove:
-
/libdir
è dalla vostra opzione-L
(un percorso di ricerca per le librerie a). -
/lib
è una costante. -
stdc
è il nome di una libreria per la ricerca (da-l
). -
ext
è uno o più estensioni (.a, .so, .sl
, ecc).
Una volta che il simbolo viene trovato, il file oggetto è legato a risolverlo. Questo può portare a più simboli insoddisfatti appaiono come /libdir/libstdc.a(printf.o)
avere un riferimento per /libdir/libstdc.a(putch.o)
.
Il tuo problema particolare può essere causato dal fatto che si sta cercando di collegare il file oggetto direttamente piuttosto che alla ricerca delle librerie. VS dovrebbe avere opzioni di progetto per specificare i file oggetto, percorsi di ricerca libreria e nomi di libreria (non sono sicuro di questo per le ultime versioni, ma so che le versioni precedenti di MSVC fatto).
Ah ... Visual Studio è stato troppo intelligente per voi
Vai ai progetti che includono il lib, fare clic destro per le proprietà
Goto Proprietà di configurazione | Linker
Nella parte inferiore: usare la biblioteca di dipendenza Ingressi - Impostare su No
Questa è un'opzione di Visual Studio per afferrare i file obj direttamente piuttosto che il file LIB. Immagino che è quello di evitare il passaggio di collegamento e di accelerare la compilazione in tal modo.
In generale, è necessario impostare il progetto che crea il file lib come dipendenza del progetto che lo utilizza (in Proprietà comuni a quella finestra proprietà). È quindi accende Link Library dipendenze. Questo metodo funziona bene nella maggior parte dei casi.