2014-04-02 11 views
9

Kiedy używam programu Visual Studio 2012 z automatycznym łączeniem, nie muszę ręcznie dodawać bibliotek boost/POCO/python, będą one dodawane automatycznie. I jeśli przegapić żadnej biblioteki, otrzymuję wiadomość tak:W jaki sposób automatyczne łączenie zwiększa wybór?

LINK : fatal error LNK1104: cannot open file 'libboost_system-vc110-mt-1_55.lib'

Ale skąd wie, który plik chcę połączyć? Może chcę dynamicznie łączyć, używając boost_system-vs110-mt-1_55.lib, lub chcę mieć z gd lub sgd w nazwie?

Jak dokonuje wyboru?

Problem polega na tym, że mój program szuka bibliotek libboost_ ... (tj. Statycznych), gdy szuka systemu, wątków itp., Ale chce boost_ (tj. Dynamiczny) dla Pythona, a ja po prostu nie rozumiem czemu?

+0

jeśli przez "auto-linking" odnosi się do korzystania z biblioteki dll, to nie zwalnia również z linkowania .libs. Aby korzystać z bibliotek dll w środowisku wykonawczym, musisz znać zawartość tych bibliotek dll podczas kompilacji, i to tutaj wkraczają pliki .lib. Jeśli chodzi o wersję, środowisko wykonawcze i mt/md (jakiego rodzaju moduł środowiska wykonawczego kompilujesz, możesz go zobaczyć w opcjach VS dla twojego projektu), powinieneś najpierw sprawdzić projekt, aby zdecydować. –

+0

Tak, rozumiem, jak dokonać wyboru samodzielnie, kompilując ten projekt przy użyciu MinGW Nie mam problemu. Ale Visual Studio bierze na siebie wybór, więc NIE MOŻEMY wybrać, robi to dla mnie. I zastanawiam się, dlaczego to taki wybór. Moje pytanie naprawdę brzmi - w jaki sposób Visual Studio dokonuje wyboru i jak sobie z tym poradzić? – Arkady

+0

Możesz to kontrolować również z VS, spójrz na Linker-> Panel wprowadzania dla .libs dołączonych podczas łączenia, a także w Linkerze-> Ogólne-> Dodatkowe katalogi łączące (IIRC) –

Odpowiedz

5

Visual Studio zezwala na stosowanie dyrektyw #pragma w kodzie źródłowym w celu ustawienia opcji linkera. W przypadku "automatycznego łączenia", Boost używa tych #pragma's w połączeniu z istniejącymi makrami.

W szczególności wygląda na to, że szukasz makro o wartości BOOST_ALL_DYN_LINK.

+0

Jak rozumiem z boost/system/config.hpp, jeśli BOOST_ALL_DYN_LINK nie jest zdefiniowany, muszę połączyć wszystkie biblioteki jako statyczne, które działa dla wszystkich z wyjątkiem pythona w tej chwili . Naprawdę chcę połączyć wszystkie biblioteki jako statyczne, więc flaga jest dokładnie tym, czego potrzebuję, a domyślne makra są wystarczająco dobre. Ale nawet jeśli ręcznie dodaję (BOOST_ALL_STATIC_LINK), to nie działa. W jakiś sposób mój kompilator uważa, że ​​boost.python nie może być statyczny. Prosi o dynamiczną bibliotekę Pythona, nawet jeśli istnieje flaga BOOST_ALL_STATIC_LINK. I nie wiem, gdzie szukać, żeby to naprawić. – Arkady

+0

@Arkady: Spróbuj być konkretnym, użyj 'BOOST_PYTHON_STATIC_LIB' – MSalters

Powiązane problemy