2015-07-21 29 views
9

Próbuję użyć biblioteki skompilowanej z mingw w visual studio. Jednak uzyskać następujące błędy linkera:Visual Studio 15 __imp___iob, __imp___pctype, __imp___mb_cur_max

błędzie LNK2001: nierozwiązanych zewnętrznych symbolu __imp___iob

błędu LNK2019: nierozwiązanych zewnętrznych symbolu __imp___pctype odwołanie w funkcji

błędzie LNK2019: nierozwiązanych zewnętrznych symbolu __imp____mb_cur_max mowa w funkcji

błąd LNK2001: nierozwiązanych zewnętrznych symbolu _fprintf

Udało mi się naprawić błąd _fprintf przez linkowanie do pliku legacy_stdio_definitions.lib zgodnie z postem: unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2.

Jednak nie mam pojęcia, jak naprawić pozostałe trzy nierozwiązane zewnętrzne. Jak mogę to naprawić? Biblioteki pracują doskonale pod Visual Studio 2013.

Edit:

Ok tutaj jest aktualizacja. Przeniosłem plik libmsvcrt.a z folderu mingw lib do Visual Studio i dodałem go do ustawień linkera. Teraz wydaje się działać poprawnie.

+0

Zespół MinGW ma sporo do zrobienia, aby ich .h pliki kompatybilne z wersją VS2015 CRT. Nie wstrzymuj oddechu, prawdopodobnie utkniesz w wersji VS2013 na jakiś czas. –

+0

Zanim zaznaczę odpowiedź poniżej, czy jest jakiś szybki hack, aby to zadziałało? Zgodnie z tym: http://stackoverflow.com/questions/30412951/unresolved-external-symbol-imp-fprintf-and-imp-iob-func-sdl2, można rozwiązać błąd __imp___iob, definiując __imp___iob, aby zwrócić coś w rodzaju szyk. Jak zmierzyć się z dwoma innymi błędami linkera i jak zdefiniować tę tablicę? –

+2

Po prostu zepsujesz funkcje uruchomieniowe C w bardzo trudny do zdiagnozowania sposób. Nie idź tam. –

Odpowiedz

5

Biblioteki zostały skompilowane w stosunku do starej wersji CRT. Nierozwiązane symbole, które otrzymujesz, są wewnętrznymi symbolami CRT, które są obecne w skompilowanej bibliotece. Musisz ponownie skompilować bibliotekę z CRT VS2015 (Universal CRT). Ale nie jestem pewien, czy MinGW obsługuje to.

Jeśli nie możesz tego zrobić, musisz nadal używać kompilatora VS2013. (Możesz użyć IDS VS2015, ustawiając zestaw narzędzi na vs2013 w opcjach projektu, ale nadal będziesz ograniczony do funkcji C++ obsługiwanych przez kompilator 2013.)

+0

Zgaduję, że będę musiał poczekać, aż aktualizacja mingw zostanie zaktualizowana. Szkoda, że ​​nie było sposobu na zbudowanie tych bibliotek przy użyciu projektu makefile Visual Studio, ale nie mogę uruchomić ./configure. –

+0

OK tutaj jest aktualizacja. Przeniosłem plik libmsvcrt.a z folderu mingw lib do Visual Studio i dodałem go do ustawień linkera. Teraz wydaje się działać poprawnie. Czy jest jakaś wada? Trzeba dodać libgcc.a mingw do VS, aby móc korzystać z biblioteki lib skompilowanej z mingw tak, więc nie wierzę tak –

+0

Tak. Minusem jest to, że biblioteka i twój program używają różnych CRT. Niektóre z bardziej interesujących efektów, które mogą wystąpić: jeśli biblioteka wywołuje funkcję malloc, może nastąpić awaria połączenia z tym wskaźnikiem przez program lub odwrotnie; biblioteka i twój program mają oddzielne globalne ustawienia regionalne. –

2

Wystąpił ten sam problem (biblioteka skompilowana ze statycznym CRT zamiast CRT w DLL) i udało mi się zrobić to działa przez zmianę dwa następujące parametry w oknie Właściwości projektu:

  • Linker> input> Ignoruj ​​specyficzne domyślne biblioteki: libc.lib
  • C/C++> Generowanie kodu> Runtime Library: Multi-threaded Debug (/ MTd)

Jeśli to nie wystarczy, to jeszcze na następującej stronie: https://social.msdn.microsoft.com/Forums/en-US/841e5723-bce4-4340-b7b3-027dcdf90f00/