Boost logging - получение неразрешенного символа
Я новичок в создании и продвижении, поэтому в этом вопросе может отсутствовать что-то очевидное:
Я строю проект с помощью cmake на Linux (Ubuntu), и я пытаюсь использовать логирование в этом проекте. Вот что я делаю, чтобы сгенерировать Makefile:
rm CMakeCache.txt
cmake ../ -DCMAKE_EXE_LINKER_FLAGS="-lboost_log -lboost_log_setup -lpthread -std=c++11" -DCMAKE_SHARED_LINKER_FLAGS="-lboost_log_setup -lboost_log -lpthread" -DCMAKE_MODULE_LINKER_FLAGS="-lboost_log_setup -lboost_log -lpthread" -DCMAKE_CXX_FLAGS="-DBOOST_LOG_DYN_LINK -std=c++11"
Компиляция проходит нормально. (Некоторые из этих флагов могут быть излишними - мне нужен только CMAKE_EXE_LINKER_FLAGS).
Когда я запускаю исполняемый файл, я получаю следующую неразрешенную ссылку:
-- ImportError: /home/mranga/gr-msod-sensor/gr-msod_sensor/build/lib/libgnuradio-msod_sensor.so: undefined symbol: _ZN5boost3log11v2_mt_posix3aux25unhandled_exception_countEv
Какие флаги мне не хватает? Моя библиотека повышения настроена, и LD_LIBRARY_PATH указывает на правильное местоположение.
Когда я вручную собираю тестовую программу, используя те же флаги компоновщика, она компилируется и работает нормально, поэтому boost установлен правильно. Надеюсь, я не пропустил очевидное.
(Перенес вопрос из списка рассылки GNU Radio - извините, если вы читаете этот пост во второй раз).
2 ответа
Похоже, вы ссылаетесь на не многопоточную версию:
-lboost_log
но компоновщик во время выполнения, похоже, явно ищет многопоточный вариант ( сайт Boost doc на этом):
_ZN5boost3log11v2_mt_posix3aux25unhandled_exception_countEv
^^
Таким образом, я предполагаю, что вы должны попробовать связаться с
-lboost_log_mt
но вопрос, правильно это или нет, слишком сильно зависит от вашего индивидуального проекта, чтобы я мог четко ответить на него.
Я считаю, что порядок библиотек в командной строке компоновщика в -DCMAKE_EXE_LINKER_FLAGS
это неверно. boost_log_setup зависит от boost_log, поэтому boost_log_setup должен идти первым.