Boost.Log с CMake вызывает неопределенную ошибку ссылки

Я пытаюсь использовать новую библиотеку Boost.Log в проекте, над которым я работаю. Проект построен с помощью CMake. Я получаю сообщения об ошибках ссылок, в которых утверждается, что компоновщик обнаружил неопределенные ссылки на Boost.Log

Linking CXX executable main
CMakeFiles/main.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x30): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'

У меня есть простой тест hello world, который не справляется с этими ошибками. Если я связываюсь с библиотеками Boost.Log, что может вызвать ошибку неопределенной ссылки?

main.cpp:

#include <boost/log/trivial.hpp>
int main(int argc, char* const argv[]) {
  BOOST_LOG_TRIVIAL(info) << "Hello World";
}

CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FIND_PACKAGE(Boost 1.54 COMPONENTS log REQUIRED)
FIND_PACKAGE(Threads)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
ADD_EXECUTABLE(main main.cpp)
TARGET_LINK_LIBRARIES(main ${Boost_LOG_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})

Изменить: подробный вывод cmake и make

cmake:

-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:476 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:478 ] Boost_USE_MULTITHREADED = TRUE
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:480 ] Boost_USE_STATIC_LIBS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:482 ] Boost_USE_STATIC_RUNTIME = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:484 ] Boost_ADDITIONAL_VERSIONS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:486 ] Boost_NO_SYSTEM_PATHS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:538 ] Declared as CMake or Environmental Variables:
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:540 ]   BOOST_ROOT = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:542 ]   BOOST_INCLUDEDIR = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:544 ]   BOOST_LIBRARYDIR = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:546 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:639 ] location of version.hpp: /usr/include/boost/version.hpp
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:663 ] version.hpp reveals boost 1.54.0
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:739 ] guessed _boost_COMPILER = -gcc48
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:749 ] _boost_MULTITHREADED = -mt
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:792 ] _boost_RELEASE_ABI_TAG = -
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:794 ] _boost_DEBUG_ABI_TAG = -d
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:842 ] _boost_LIBRARY_SEARCH_DIRS = /usr/lib64;NO_DEFAULT_PATH
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:930 ] Searching for LOG_LIBRARY_RELEASE: boost_log-gcc48-mt-1_54;boost_log-gcc48-mt;boost_log-mt-1_54;boost_log-mt;boost_log
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:966 ] Searching for LOG_LIBRARY_DEBUG: boost_log-gcc48-mt-d-1_54;boost_log-gcc48-mt-d;boost_log-mt-d-1_54;boost_log-mt-d;boost_log-mt;boost_log
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:1017 ] Boost_FOUND = 1
-- Boost version: 1.54.0
-- Found the following Boost libraries:
--   log
-- Configuring done
-- Generating done
-- Build files have been written to: /home/durrw/boost-log-test/build

сделать:

/usr/bin/cmake -H/home/durrw/boost-log-test -B/home/durrw/boost-log-test/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/durrw/boost-log-test/build/CMakeFiles /home/durrw/boost-log-test/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/durrw/boost-log-test/build'
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend
make[2]: Entering directory `/home/durrw/boost-log-test/build'
cd /home/durrw/boost-log-test/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/durrw/boost-log-test /home/durrw/boost-log-test /home/durrw/boost-log-test/build /home/durrw/boost-log-test/build /home/durrw/boost-log-test/build/CMakeFiles/main.dir/DependInfo.cmake --color=
make[2]: Leaving directory `/home/durrw/boost-log-test/build'
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build
make[2]: Entering directory `/home/durrw/boost-log-test/build'
Linking CXX executable main
/usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1
/usr/bin/c++       CMakeFiles/main.dir/main.cpp.o  -o main -rdynamic -lboost_log -lpthread 
CMakeFiles/main.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x39): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'

person Bill D    schedule 24.07.2013    source источник
comment
Если вы запустите cmake . -DBoost_DEBUG=1, а также make VERBOSE=1, вы получите гораздо больше информации о том, что делает CMake и какова фактическая команда компоновщика. Не стесняйтесь добавлять их в свой вопрос, чтобы получить дополнительную помощь.   -  person Fraser    schedule 25.07.2013
comment
Вывод отладки был полезен, но, похоже, все еще не помогает, поскольку он связан с boost_log   -  person Bill D    schedule 25.07.2013


Ответы (3)


Похоже, все сводится к привязке к общей версии Boost.Log.

Немного подробностей по этой проблеме содержится в docs for Boost.Log В вашем сообщении об ошибке упоминается пространство имен boost::log::v2s_mt_posix, а из документации это означает, что компоновщик ожидает ссылки на статическую версию Boost.Log.

Если вы хотите создать ссылку на общую версию, кажется, вам нужно определить BOOST_LOG_DYN_LINK или BOOST_ALL_DYN_LINK, т.е. в вашем CMakeLists.txt добавьте:

ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK)

Если вы хотите создать ссылку на статическую версию Boost.Log, вместо этого вам нужно добавить переменную CMake перед вызовом FIND_PACKAGE(Boost ...):

SET(Boost_USE_STATIC_LIBS ON)
FIND_PACKAGE(Boost 1.54 COMPONENTS log REQUIRED)

Дополнительные сведения о переменных, которые влияют на то, как CMake находит Boost, см. В документации для _ 7_.

person Fraser    schedule 25.07.2013
comment
Необходимо добавить ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK) в мои файлы CMakeLists.txt. Также я новичок в CMake и не осознавал, что вещи не переносятся в файлы CMakeLists.txt во вложенных папках. Думал, что могу добавить его в файл CMakeLists.txt в корневой папке и применить ко всем подпапкам. Однако я обнаружил, что CMake работает не так. - person Bill D; 07.10.2013

Это Boost_INCLUDE_DIRS, а не Boost_INCLUDE_DIR.

Вы можете попробовать включить Boost_USE_STATIC_LIBS

person RobertJMaynard    schedule 24.07.2013
comment
Согласно документам для FindBoost, похоже, что любая переменная теперь действительна. Кроме того, если это было неправильно, не приведет ли это к ошибке компилятора, а не к ошибке компоновщика? - person Fraser; 25.07.2013
comment
Поддержка Boost_INCLUDE_DIR была добавлена ​​в CMake 2.8.11 и действительно не может использоваться, если вы не принудительно проверяете версию CMake. - person RobertJMaynard; 25.07.2013
comment
Ах хорошо. Тем не менее, была бы проблема компилятора с вызовом C ++ #include, если бы это было неправильно, не так ли? - person Fraser; 25.07.2013

Для CMake 3.15 (и некоторых более ранних версий) следующего достаточно для создания Boost.Log с CMake без исходной ошибки компоновщика:

cmake_minimum_required(VERSION 3.15)
project(boost_log_tutorial)

SET(Boost_USE_STATIC_LIBS ON)           # link statically
#ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK)  # or, link dynamically

find_package(Boost 1.69.0 COMPONENTS log REQUIRED)

add_executable(boost_log_tutorial main.cpp)
target_link_libraries(boost_log_tutorial Boost::log_setup Boost::log)

Похоже, что ключевые вещи связаны с Boost:log_setup и Boost::log и задают статическое или динамическое связывание с SET(Boost_USE_STATIC_LIBS ON) или ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK).

person davidA    schedule 01.10.2019