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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top