2017-02-04 9 views
7

Postanowiłem zaktualizować moje biblioteki boost z 1.61 do 1.63, a w projekcie, który zaktualizowałem do korzystania z nowych plików, otrzymuję kilka nowych komunikatów o błędach, których nie miałem. t coraz wcześniej:LNK2001: Moje biblioteki boost są (prawdopodobnie) zbudowane niepoprawnie

error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 

od moich 1,63 biblioteki są kompilowane przy użyciu programu Visual Studio 2017, mój pierwszy założeniem jest to, że zrobiłem błąd kompilacji biblioteki Boost, więc tutaj są całkowite kroki biorę od czyste rozpakowanie plików boost:

  1. Menu Start → Visual Studio 2017 RC → Komenda programisty d Podpowiedź
  2. Zmieniam katalog, dopóki nie znajdę się w folderze wysokiego poziomu boost_1_63_0.
  3. biegnę bootstrap.bat
  4. otworzyć project-config.jam edycji
  5. zmienić using msvc ; do using msvc : 14.1 : E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC\14.10.24911\bin\HostX64\x64\;
  6. otworzyć boost/config/auto_link.hpp edycji
  7. robię zmienił się do tego pliku (kod podany poniżej po wykazie)
  8. W otwartym wierszu polecenia wykonuję polecenie: b2 architecture=x86 address-model=64 link=static threading=multi runtime-link=shared --build-type=complete stage --stagedir=stage/x64 -a
  9. Kończy się następującym komunikatem na końcu (wymienionym poniżej na rufie) er lista)
  10. Próbuję użyć tych bibliotek z moim kodem, używając #define BOOST_LIB_DIAGNOSTIC do śledzenia, że ​​używane są właściwe pliki (są).
  11. Próbuję skompilować mój projekt, który używa boost.asio, i uzyskać dwa nierozwiązane zewnętrzne błędy symboli wymienione powyżej.

Czy ktoś wie, gdzie jest mój błąd? Błędy te nie występują, jeśli korzystam z bibliotek doładowania 1.61 skompilowanych przy użyciu Visual Studio 2015 w Visual Studio 2017 RC.

auto_link.hpp (stary):

# elif defined (BOOST_MSVC) 

    // vc14: 
# define BOOST_LIB_TOOLSET "vc140" 

auto_link.hpp (nowy):

# elif defined (BOOST_MSVC) && (BOOST_MSVC < 1910) 

    // vc14: 
# define BOOST_LIB_TOOLSET "vc140" 

# elif defined (BOOST_MSVC) 

    // vc15: 
# define BOOST_LIB_TOOLSET "vc141" 

wiadomość na koniec procesu doładowania kompilacji:

...failed updating 6 targets... 
...skipped 4 targets... 
...updated 904 targets... 

Bibliotek pokazano za pomocą #define BOOST_LIB_DIAGNOSTIC:

1>Linking to lib file: libboost_system-vc141-mt-1_63.lib 
1>Linking to lib file: libboost_date_time-vc141-mt-1_63.lib 
1>Linking to lib file: libboost_regex-vc141-mt-1_63.lib 

Daj mi znać, jeśli potrzebujesz innych informacji diagnostycznych. Próbowałem komentować różne zastosowania biblioteki boost.asio, ale usunięcie nagłówka całkowicie wyeliminowało te problemy (co oczywiście spowodowało, że komponenty doładowania były bezużyteczne).

+0

Nie jestem pewien, czy ma to coś wspólnego z błędami, ale ścieżka do zestawu narzędzi 'msvc' wygląda dziwnie: jest w' Program Files', a nie 'Programie Pliki (x86) ', tak jakbyś był w 32-bitowym systemie Windows, ale żądasz 64-bitowego natywnego kompilatora (' HostX64'). Skrót "Developer Command Prompt" odpowiada także 'HostX86 \ x86' (32-bitowy kompilator budujący 32-bitowy kod). Aby uzyskać 64-bitowy kompilator budujący 64-bitowy kod, należy użyć skrótu 'x64 Native Tools Command Prompt'. Może to jakoś zagmatwało skrypty budujące? – bogdan

+0

Po prostu na offchance, nie używasz plików nagłówkowych starej wersji boost podczas łączenia z nowym jesteś? Być może trzeba będzie zaktualizować ścieżkę preprocesora do nowego pasującego boostu? – Vality

+0

@bogdan Kiedy instaluję pliki na dysku 'E: /', zazwyczaj zmuszam je do zainstalowania w folderze 'Program Files', niezależnie od tego, czy chce używać przyrostka (x86), czy też nie. A ponieważ zrobiłem to dla VC2015 i VC2107, nie sądzę, że to problem. Zajmę się jednak użyciem x64 Native Tools Command Prompt i zobaczę, czy działa, czy nie. – Xirema

Odpowiedz

4

To wydaje się być podobne do LNK 2019 error using Boost::asio, ponieważ masz te same błędy.

Właśnie zainstalowałem VS2017RC i podbił 1.63. Następnie użyłem tego opisu: Build boost with msvc 14.1 (VS2017 RC) .Uwaga: Twoja linia powinna prawdopodobnie zawierać "cl.exe" i cytaty.

using msvc : 14.1 : "E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC\14.10.24911\bin\HostX64\x64\cl.exe"; 

... Powinny one wdrożenie pasek postępu lub takie;) Zgadnij co:

...failed updating 6 targets... 
...skipped 4 targets... 
...updated 1214 targets... 

więc spojrzeć na komunikat o błędzie:

msvc.compile.asm bin.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_x86_64_ms_pe_masm.obj 
'ml64' is not recognized as an internal or external command, operable program or batch file. 
ml64 -nologo -c -Zp4 -Cp -Cx -DBOOST_ALL_NO_LIB=1 -DBOOST_CONTEXT_EXPORT= -DBOOST_CONTEXT_SOURCE -DBOOST_ALL_NO_LIB=1 -DBOOST_CONTEXT_EXPORT= -DBOOST_CONTEXT_SOURCE /Zi /Zd /W3 -Fo "bin.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_x86_64_ms_pe_masm.obj" "libs\context\src\asm\make_x86_64_ms_pe_masm.asm" 
...failed msvc.compile.asm bin.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_x86_64_ms_pe_masm.obj... 

Brakujący 64-bitowych zależnościami ... Tak, jak KindDragon mówi w drugim linku:

Uruchom "Wiersz poleceń programisty dla VS 2017 RC" z menu Start systemu Windows, aby wywołać boost z powłoki skonfigurowanej za pomocą xcvars x86 lub x64 vcvars.

Konieczne jest skonfigurowanie powłoki przy użyciu 64-bitowych zmiennych kompilatora.

cd "\Program Files (x86)\Microsoft Visual Studio 14.0\VC" 
vcvarsall amd64 

..alternatively można rozpocząć natywnym środowisku x64 z menu Start: -> Visual Studio 201x -> Visual Studio Tools -> Windows Desktop Command Prompts -> VS201x x64 Native Tools Command Prompt

a następnie zbudować ponownie.

...failed updating 2 targets... 
...skipped 2 targets... 
...updated 6 targets... 

Z komunikatem o błędzie fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'. Tak więc konieczna jest przebudowa.

b2 --clean-all 
etc... 

... Dostajesz punkt. Ale wydaje mi się, że teraz czytam w komentarzach, które Bogdan również o tym wspomniał. No cóż, Kinddragon w Build boost with msvc 14.1 (VS2017 RC) był w rzeczywistości pierwszy;)

+0

Ta odpowiedź pokazuje wystarczający wysiłek i oszczędza mi konieczności pisania, więc myślę, że nie ma problemu z otrzymaniem nagrody. Z korzyścią dla innych czytelników uważam, że byłoby wspaniale, gdyby wniosek był bardziej znaczący - ułatwiłby komuś zrozumienie przyczyny problemu. – bogdan

+1

dzięki bogdan. Lepiej to? – JHBonarius

Powiązane problemy