невизначене посилання на boost :: system :: system_category () при компілюванні


105

Я намагаюся скласти програму на Ubuntu 11.10, яка використовує бібліотеки Boost. У мене встановлені бібліотеки Boost 1.46-dev з репозиторію Ubuntu, але я отримую помилку під час компіляції програми.

undefined reference to boost::system::system_category()

Що я роблю неправильно?


6
Це не помилка компілятора, це помилка лінкера . Вам потрібно зв’язатись із бібліотекою Boost.System.
ildjarn

Відповіді:


160

Використовувана бібліотека підсилення залежить від бібліотеки boost_system. (Не всі вони це роблять.)

Припустимо, що ви використовуєте gcc, спробуйте додати -lboost_systemдо командного рядка компілятора, щоб зв’язатись із цією бібліотекою.


3
Я використовую g ++ Makefile для компіляції. Де зазвичай ставлять такі прапори?
користувач1049697

2
Спосіб збирання командного рядка компілятора / лінкера сильно залежить від конкретного випадку. Чому ви не вставите Makefile (або відповідні його частини) у своє запитання? Таким чином, ви можете отримати відповідь, яка працює у вашому конкретному випадку.
hc_

7
Добре, я редагував Makefile.am і додав -lboost_system, так це виглядало так: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. Це не допомогло, хоча ...
user1049697

1
Ще та сама помилка? Ви бігали autoreconfпісля цього? Крім того, ця публікація та ця може допомогти вам у налаштуванні автоінструментів.
hc_

2
Я замінив sslsniff_LDFLAGSз sslsniff_LDADDв Makefile.am і це не спрацювало. Потім я втримав і те, sslsniff_LDFLAGSі додав sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. Тоді я зміг скласти. Дякую за допомогу!
користувач1049697

62

Пов’язання з бібліотекою, яка визначає пропущений символ ( -lboost_system), є очевидним рішенням, але в конкретному випадку Boost.System, неправильність в оригінальному дизайні робить його корисним boost::system::generic_category()і boost::system::system_category()непотрібним. Компіляція з прапором -DBOOST_SYSTEM_NO_DEPRECATEDвимикає цей код і дозволяє компілювати ряд програм, не вимагаючи цього -lboost_system(звичайно, це посилання все ще потрібне, якщо ви явно використовуєте деякі функції бібліотеки).

Починаючи з Boost 1.66 та виконуючи це , ця поведінка тепер є за замовчуванням, тому, сподіваємось, менше відповідей потребує такої відповіді.

Як зауважив @AndrewMarshall, альтернативою є визначення, BOOST_ERROR_CODE_HEADER_ONLYяке дозволяє версію коду, призначена лише для заголовка. Це не відштовхувало Boost, оскільки це може порушити деякі функції. Однак, починаючи з 1,69, здається, лише заголовок став за замовчуванням , що, мабуть, робить це питання застарілим.


4
Дякую!!! нічого не допомогло, оскільки я використовую boost 1.41 (Centos SL), єдине, що мене звільнило, - це використання -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit

5
Насправді, можливо, ви хочете -DBOOST_ERROR_CODE_HEADER_ONLY
Ендрю Маршалл

1
Цікаво, що нова поведінка Boost 1.66, що має менше посилань на system_category () тощо, може ввести нові проблеми з посиланням за наявності проблем упорядкування посилань. Див github.com/PointCloudLibrary/pcl/pull/2236 , наприклад
pixelbeat

3
Якщо ви використовуєте CMake, просто додайте "add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)"
nickolay

1
Єдине виправлення, яке працювало для мене з Boost 1.68, - це визначити BOOST_ERROR_CODE_HEADER_ONLY.
сакра

17

Ще одне рішення для тих, кому не потрібен весь шебанг: використовуйте перемикач

-DBOOST_ERROR_CODE_HEADER_ONLY.

Якщо ви використовуєте CMake, це так add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).


1
Нещодавно я стикався з цією проблемою. Нічого не працює, окрім цього. Цікаво, чи це все-таки не відштовхує прискорення, про що йдеться у відповіді Марка Глісса.
Джон З. Лі

1
цитата "Boost.System тепер призначений лише для заголовка. Бібліотека заглушок все ще створена для сумісності, але посилання на неї більше не потрібна."
Джон З. Лі

16

Вищевказана помилка є помилкою в контенті .

Ви повинні додати -lboost_systemдо себе прапорці посилання, що вказує на лінкер, що він повинен шукати символи, як boost::system::system_category()у бібліотеці libboost_system.so.

Якщо у вас є main.cpp, будь-який:

g++ main.cpp -o main -lboost_system

АБО

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

5
простір між -l та назвою бібліотеки невірно. Ви повинні використовувати -lboost_system
portforwardpodcast

1
Я виявив, що центоси не дбають про позицію -l, але ubuntu зробив, має бути в кінці.
запитав_io

7

Під час використання CMAKE та find_package переконайтесь, що це:

find_package(Boost COMPONENTS system ...)

і ні

find_package(boost COMPONENTS system ...)

Деякі люди, можливо, втратили години на це ...


6

У мене така ж проблема:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. Text + 0x54): невизначене посилання на `boost :: system :: generic_category ()

Рішенням було використання налагодженої версії system-lib:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

Але чому?


1
Можливо, десь був визначений якийсь прапор налагодження, тож у вас були вбудовані інші lib в налагодження або g ++ виробляв налагодження obj?
noonex

4

Коли у мене виникли ці проблеми, причиною було впорядкування бібліотек. Щоб виправити це, я поставив libboost_systemостаннє:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

Це було на mingw з gcc 5.3 та boost 1.61.0 на прикладі простого таймера.


1
Це була і моя проблема. Я включив його через CMake і, з будь-якої причини, припустив, що залежності та впорядкування були розроблені в сценарії FindBoost. Дійсно, однак, моя проблема завжди полягала у використанні спільних бібліотек і ніколи не звертала уваги, а потім переходила до статичних бібліотек і отримувала помилки в побудові. На жаль
Ентоні

Це було виправлено і для мене ... перед цим рішенням єдиним, що працювало, було визначення BOOST_ERROR_CODE_HEADER_ONLY. У Ubuntu 18.04 підсилюйте 1,68, використовуючи cmake. Моє виправлення: target_link_libraries (виконувана pthread ssl crypto boost_system)
Луїс

2

у моєму випадку додавання -lboost_systemбуло недостатньо, він все ще не міг знайти його в моєму індивідуальному середовищі побудови. Мені довелося скористатися порадою у розділі " Позбутися" "gcc - / usr / bin / ld: lib попередження не знайдено" та змінити ./configureкоманду на:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

Докладніше див. Boost 1.51: "Помилка: не вдалося зв’язати проти boost_thread!"


1

... і якщо ви хочете статично пов’язати своє основне, у свій Jamfile додайте до вимог наступне:

<link>static
<library>/boost/system//boost_system

а можливо також:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.