2015-07-21 29 views
9

Sto cercando di utilizzare una libreria compilata con mingw in Visual Studio. Tuttavia, ottengo i seguenti errori del linker:Visual Studio 15 __imp___iob, __imp___pctype, __imp___mb_cur_max

errore LNK2001: simbolo esterno __imp___iob

errore LNK2019: simbolo esterno non risolto __imp___pctype riferimento in funzione

errore LNK2019: simbolo esterno non risolto __imp____mb_cur_max riferimento in funzione

errore LNK2001: simbolo esterno _fprintf

Sono stato in grado di correggere l'errore _fprintf collegandolo a legacy_stdio_definitions.lib come da questo post: unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2.

Tuttavia, non ho idea di come risolvere gli altri tre elementi esterni non risolti. Come posso risolvere questo? Le librerie funzionano perfettamente in Visual Studio 2013.

Edit:

Va bene qui è un aggiornamento. Ho spostato libmsvcrt.a dalla cartella mingw lib in Visual Studio e l'ho aggiunto alle impostazioni del linker. Ora sembra funzionare correttamente.

+0

La squadra MinGW ha un sacco di lavoro da fare per rendere i propri file .h compatibile con la versione VS2015 del CRT. Non trattenere il respiro per questo, probabilmente sarai bloccato con la versione VS2013 per un po '. –

+0

Prima di contrassegnare la risposta qui sotto, c'è qualche trucco veloce per farlo funzionare? In base a questo: http://stackoverflow.com/questions/30412951/unresolved-external-symbol-imp-fprintf-and-imp-iob-func-sdl2, si può risolvere l'errore __imp___iob definendo __imp___iob per restituire una sorta di array. Come procedere nel correggere gli altri due errori del linker e come sarebbe definito questo array? –

+2

Basta interrompere le funzioni di runtime C in un modo molto difficile da diagnosticare. Non andare lì. –

risposta

5

Le librerie sono state compilate su una vecchia versione del CRT. I simboli irrisolti che ottieni sono simboli interni del CRT presenti nella libreria compilata. È necessario ricompilare la libreria con il CRT VS2015 (Universal CRT). Ma non sono sicuro che MinGW lo supporti.

Se non è possibile farlo, è necessario continuare a utilizzare il compilatore VS2013. (È possibile utilizzare l'IDE VS2015, impostando il set di strumenti su vs2013 nelle opzioni del progetto, ma sarà comunque limitato alle funzionalità C++ supportate dal compilatore 2013)

+0

Indovina che dovrò aspettare fino a quando mingw non sarà aggiornato. Vorrei che ci fosse un modo per costruire questi lib usando l'abilità del progetto makefile di Visual Studio, ma non riesco a far funzionare ./configure. –

+0

Ok ecco un aggiornamento. Ho spostato libmsvcrt.a dalla cartella mingw lib in Visual Studio e l'ho aggiunto alle impostazioni del linker. Ora sembra funzionare correttamente. C'è qualche svantaggio nel fare questo? Si deve aggiungere la libgcc.a di mingw a VS per essere in grado di usare lib's compilato con mingw comunque, quindi non ci credo –

+0

Sì. Lo svantaggio è che la libreria e il tuo programma utilizzano CRT diversi. Alcuni degli effetti più interessanti che possono verificarsi: se la libreria chiama malloc, una chiamata a liberare su quel puntatore dal tuo programma potrebbe bloccarsi, o viceversa; la libreria e il tuo programma hanno localizzazioni globali separate. –

2

Ho riscontrato lo stesso problema (libreria compilata con statico CRT invece di CRT nella DLL) e sono riuscito a farlo funzionare, cambiando i due seguenti parametri in Proprietà del progetto:

  • Linker> input> Ignora specifiche librerie predefinite: libc.lib
  • C/C++> Generazione codice> Libreria di runtime: Debug multithread (/ MTd)

Se questo non bastasse, c'è di più alla pagina seguente: https://social.msdn.microsoft.com/Forums/en-US/841e5723-bce4-4340-b7b3-027dcdf90f00/