Próbuję skompilować program na Ubuntu 11.10, który używa bibliotek Boost. Mam zainstalowane biblioteki 1.46-dev Boost z repozytorium Ubuntu, ale podczas kompilacji programu pojawia się błąd.
undefined reference to boost::system::system_category()
Co takiego robię źle?
Odpowiedzi:
Biblioteka boost, której używasz, zależy od biblioteki boost_system. (Nie wszyscy to robią.)
Zakładając, że używasz gcc, spróbuj dodać
-lboost_system
do wiersza poleceń kompilatora, aby połączyć się z tą biblioteką.źródło
-lboost_system
, więc wyglądało to tak:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. To jednak nie pomogło ...autoreconf
później? Również ten post i ten mogą pomóc w konfiguracji narzędzi automatycznych.sslsniff_LDFLAGS
zsslsniff_LDADD
w Makefile.am i to nie pomogło. Potem zachowałem obasslsniff_LDFLAGS
i dodałemsslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. Wtedy udało mi się skompilować. Dziękuję za pomoc!Powiązanie z biblioteką, która definiuje brakujący symbol (
-lboost_system
) jest oczywistym rozwiązaniem, ale w konkretnym przypadku Boost.System, błąd w oryginalnym projekcie sprawia, że jest on użytecznyboost::system::generic_category()
iboost::system::system_category()
niepotrzebny. Kompilowanie z flagą-DBOOST_SYSTEM_NO_DEPRECATED
wyłącza ten kod i pozwala wielu programom kompilować się bez wymagania-lboost_system
(to łącze jest oczywiście nadal potrzebne, jeśli jawnie używasz niektórych funkcji biblioteki).Począwszy od Boost 1.66 i tego zatwierdzenia , to zachowanie jest teraz domyślne, więc miejmy nadzieję, że coraz mniej użytkowników powinno potrzebować tej odpowiedzi.
Jak zauważył @AndrewMarshall, alternatywą jest zdefiniowanie,
BOOST_ERROR_CODE_HEADER_ONLY
które włącza wersję kodu zawierającą tylko nagłówki. Było to zniechęcone przez Boost, ponieważ może to zepsuć niektóre funkcje. Jednak od wersji 1.69 wydaje się, że tylko nagłówek stał się domyślny , rzekomo czyniąc to pytanie przestarzałym.źródło
BOOST_ERROR_CODE_HEADER_ONLY
.Kolejne obejście dla tych, którzy nie potrzebują całego shebangu: użyj przełącznika
-DBOOST_ERROR_CODE_HEADER_ONLY
.Jeśli używasz CMake, to jest
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.źródło
Powyższy błąd to błąd konsolidatora ... konsolidator to program, który pobiera jeden lub więcej obiektów wygenerowanych przez kompilator i łączy je w jeden program wykonywalny.
Musisz dodać
-lboost_system
do siebie flagi konsolidatora, które wskazują konsolidatorowi, że musi szukać symboli takich jakboost::system::system_category()
w bibliotecelibboost_system.so
.Jeśli masz plik main.cpp:
LUB
źródło
Używając CMAKE i find_package, upewnij się, że jest to:
i nie
Niektórzy mogli stracić na to godziny ...
źródło
Mam ten sam problem:
Rozwiązaniem było użycie wersji debugowania biblioteki systemowej:
Ale dlaczego?
źródło
Kiedy miałem ten problem, przyczyną było uporządkowanie bibliotek. Aby to naprawić, wstawiłem
libboost_system
ostatnią:Było to na mingw z gcc 5.3 i boost 1.61.0 z prostym przykładem timera.
źródło
w moim przypadku dodanie
-lboost_system
nie wystarczyło, nadal nie mógł go znaleźć w moim niestandardowym środowisku kompilacji. Musiałem skorzystać z porady w Pozbądź się "gcc - / usr / bin / ld: warning lib not found" i zmień moje./configure
polecenie na:Aby uzyskać więcej informacji, zobacz Boost 1.51: "błąd: nie można połączyć z boost_thread!"
źródło
... a na wypadek, gdybyś chciał statycznie połączyć swój główny plik, w swoim Jamfile dodaj następujące wymagania do wymagań:
a może także:
źródło