2015-04-10 14 views
10

Sono abituato a compilare per Linux, quindi questa roba in formato .lib è un po 'strana per me. Con il mio programma in Visual Studio continuo a ricevere un simbolo esterno non risolto casuale per altre librerie e persino Microsoft Runtimes.Simboli esterni non risolti casuali che non dovrebbero essere lì

1>glfw3.lib(init.c.obj) : error LNK2019: unresolved external symbol __imp__vsnprintf referenced in function __glfwInputError 
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp__vsnprintf 
1>glfw3.lib(context.c.obj) : error LNK2019: unresolved external symbol __imp__sscanf referenced in function _parseVersionString 
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp___vsnprintf 
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\OLDNAMES.lib : warning LNK4272: library machine type 'UNKNOWN' conflicts with target machine type 'X86' 

io sono solo, tra cui queste librerie e posso confermare che sono stati trovati:

x86/glew32s.lib 
x86/glfw3.lib 
x86/glfw3dll.lib 
opengl32.lib 

Con i loro valori ereditati:

kernel32.lib 
user32.lib 
gdi32.lib 
winspool.lib 
comdlg32.lib 

posso confermare che questo è l'ordine esatto . Ho provato a installare e reinstallare Windows 7 SDK e Visual Studio - Sono anche su Windows 7.

Qualsiasi aiuto in merito a questo problema sarebbe apprezzato e sono felice di fornire ulteriori informazioni se necessario.

Grazie, Boncey

+0

Apparentemente questo non è un problema nel trovare le librerie, ma le architetture di corrispondenza errata (anche se ciò che sta facendo 'UNKNOWN 'qui è un po' sconcertante ...). – JBL

+0

Non ho idea, non ho idea di cosa faccia OLDNAMES.lib e non l'ho incluso comunque. : s – Boncey

+0

@ JBL Non ne sono così sicuro; Ottengo lo stesso errore con glfw a 32 bit + MSVCRT.lib a 32 bit come con glfw a 64 bit + MSVCRT.lib a 64 bit. – Dan

risposta

7

Il problema è che le librerie statiche glfw sono state create con una versione diversa di Visual Studio rispetto a quella che si sta utilizzando. A partire dalla primavera 2015, quelli preinstallati su glfw.org non sono compatibili con Visual Studio 2015 RC (che sembra si stia utilizzando).

Fortunatamente, GLFW è una piccola base di codice rilasciata con una licenza permissiva, quindi la soluzione più semplice è solo creare un nuovo progetto per la soluzione. I passaggi andranno in questo modo:

  1. Creare un nuovo progetto vuoto GLFW nella soluzione.
  2. Copia nello include, deps/GL e creare una cartella src.
  3. Copia tutti i file di origine nella cartella src per le piattaforme che intendi supportare. Per Windows, questo è tutto con un prefisso win o wgl o nessun prefisso. Puoi ignorare tutte le cose di cmake.
  4. creare un file in src chiamato glfw_config.h contenente #defines di _GLFW_WIN32, _GLFW_WGL e _GLFW_USE_OPENGL. Se vuoi supportare più di una semplice finestra, devi definire in modo condizionale le opzioni che desideri in questo file. Tutte le opzioni sono descritte in src/glfw_config.h.in.
  5. Aggiungere tutti i file rilevanti al progetto Visual Studio.
  6. Nelle opzioni del progetto, impostare Tipo di configurazione su lib statico. In C/C++> Generale, assicurarsi che i controlli SDL siano disabilitati. E in Preprocessore, aggiungere alle definizioni.
  7. Imposta il progetto principale in modo che dipenda dal progetto GLFW (nel menu del tasto destro del mouse). Infine, aggiungi la lib corretta GLFW alle dipendenze del tuo linker. (Ho la directory di output per GLFW impostato in modo lib corretta è solo $(SolutionDir)GLFW\$(Platform)\$(Configuration)\glfw.lib.)
+0

Aggiornamento 2/2017 - i binari vs2015 sono ora disponibili sul sito Web di glfw. –

0

Sembra ci sia un misconnect tra la dinamica e statica di collegamento libreria di runtime. Il prefisso "__imp" sui simboli indica che il codice sta cercando qualcosa da una DLL, ma le librerie che stai collegando probabilmente si aspettano le librerie di runtime statiche.

Visualizzare le pagine delle proprietà del progetto (in Build-> Proprietà) e cercare la categoria C++ sulla sinistra. Sotto "Generazione codice" dovrebbe esserci una voce chiamata "Libreria di runtime". Questo è probabilmente attualmente impostato su DLL di debug multi-thread (/ MDd), poiché sembra che tu stia compilando in modalità di debug. Cambiare questo in Multi-threaded Debug (/ MTd) e ricompilare tutto. Vedi se ora funziona.

+3

Questo non ha risolto nulla. – Boncey

18

è anche possibile aggiungere una libreria aggiuntiva per il vostro input linker cioè, legacy_stdio_definitions.lib

Vai a Proprietà> Linker> Input .

E in Dipendenze aggiuntive aggiungere la libreria di cui sopra.

+1

Poiché è un po 'poco chiaro che cosa aggiungere esattamente, il campo "Ulteriori dipendenze" è un elenco di percorsi separati da punto e virgola. Sembra che aggiungere semplicemente '; legacy_stdio_definitions.lib' dovrebbe essere sufficiente. Non so dove questo file è sul disco, ma VS è stato in grado di trovarlo. – Kat

+1

Puoi anche fare riferimento a questo all'interno di un file .cpp tramite #pragma comment (lib, "legacy_stdio_definitions.lib") – adzm

+0

ha funzionato bene –

Problemi correlati