Boost.Log与CMake的不确定导致错误引用 [英] Boost.Log with CMake causing undefined reference error

查看:1637
本文介绍了Boost.Log与CMake的不确定导致错误引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用新Boost.Log库中的一个项目我工作。该项目是建立与CMake的。我收到链接错误声称该链接器遇到未定义的引用Boost.Log

 链接CXX可执行的主
CMakeFiles / main.dir / main.cpp.o:在函数'主':
。main.cpp中:(文字+的0x30):未定义的引用`的boost ::登录:: v2s_mt_posix ::琐碎::记录::得到()

我有一个简单的Hello World测试失败,这些错误。如果我对连接的Boost.Log库什么会导致它生成一个未定义的引用错误?

main.cpp中:

 的#include<升压/日志/ trivial.hpp>
INT主(INT ARGC,char * const的的argv []){
  BOOST_LOG_TRIVIAL(信息)LT;< 你好,世界;
}

的CMakeLists.txt:

  CMAKE_MINIMUM_REQUIRED(版本2.8)
FIND_PACKAGE(升压1.54组件所需日志)
FIND_PACKAGE(线程)
INCLUDE_DIRECTORIES($ {} Boost_INCLUDE_DIR)
ADD_EXECUTABLE(主main.cpp中)
TARGET_LINK_LIBRARIES(主要$ {Boost_LOG_LIBRARY} $ {} CMAKE_THREAD_LIBS_INIT)

编辑:详细的输出从cmake并让

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]报称CMake的或环境变量:
- [/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
- version.hpp的[/usr/share/cmake-2.8/Modules/FindBoost.cmake:639]位置:/usr/include/boost/version.hpp
- [/usr/share/cmake-2.8/Modules/FindBoost.cmake:663] version.hpp揭示提振1.54.0
- [/usr/share/cmake-2.8/Modules/FindBoost.cmake:739]猜到_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]搜索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]搜索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
- 升压版本:1.54.0
- 发现下列Boost库:
- 日志
- 配置完成
- 生成完成
- 建立文件已被写入:/家庭/ durrw /升压登录测试/建造

 的/ usr / bin中/ cmake的-H /家庭/ durrw /升压登录测试-B /家庭/ durrw /升压登录测试/建造--check-建设 - 系统CMakeFiles / Makefile.cmake 0
在/ usr /斌/ cmake的-E cmake_progress_start /家庭/ durrw /升压登录测试/建设/ CMakeFiles /home/durrw/boost-log-test/build/CMakeFiles/progress.marks
使-f CMakeFiles / Makefile2所有
使[1]:进入目录`/家庭/ durrw /升压登录测试/编译
使-f CMakeFiles / main.dir / build.make CMakeFiles / main.dir /取决于
使[2]:进入目录`/家庭/ durrw /升压登录测试/编译
CD /家庭/ durrw /升压登录测试/建造和放大器;&安培;在/ usr /斌/ cmake的-E cmake_depends的Unix的Makefile的/ home / durrw /升压登录测试的/ home / durrw /升压登录测试的/ home / durrw /升压登录测试/建设/家庭/ durrw /升压登录测试/建造/home/durrw/boost-log-test/build/CMakeFiles/main.dir/DependInfo.cmake --color =
使[2]:离开目录`/家庭/ durrw /升压登录测试/编译
使-f CMakeFiles / main.dir / build.make CMakeFiles / main.dir /建造
使[2]:进入目录`/家庭/ durrw /升压登录测试/编译
链接CXX可执行的主
在/ usr /斌/ cmake的-E cmake_link_script CMakeFiles / main.dir / link.txt --verbose = 1
在/ usr /斌/ C ++ CMakeFiles / main.dir / main.cpp.o -o主要-rdynamic -lboost_log -lpthread
CMakeFiles / main.dir / main.cpp.o:在函数'主':
。main.cpp中:(文字+ 0x39):未定义的引用`的boost ::登录:: v2s_mt_posix ::琐碎::记录::得到()


解决方案

它看起来像它归结为链接到Boost.Log的共享版本。

有是在<一个问题详细一点的href=\"http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/rationale/namespace_mangling.html\">docs对于Boost.Log 你的错误消息中提到的名称空间的boost ::登录:: 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(升压...)

SET(Boost_USE_STATIC_LIBS ON)
FIND_PACKAGE(升压1.54组件所需日志)

有关影响的CMake如何找到升压更多变量,请参阅<一的文档href=\"http://www.cmake.org/cmake/help/v2.8.11/cmake.html#module%3aFindBoost\"><$c$c>FindBoost.

I am trying to use the new Boost.Log library in a project I am working on. The project is built with CMake. I am receiving link errors claiming that the linker has come across undefined references to 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()'

I have a simple hello world test that fails with these errors. If I am linking against the Boost.Log libraries what would cause it to generate an undefined reference error?

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})

Edit: verbose output from cmake and 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

make:

/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()'

解决方案

It looks like it boils down to linking to the shared version of Boost.Log.

There is a bit of detail on the issue in the docs for Boost.Log Your error message mentions the namespace boost::log::v2s_mt_posix and from the docs, this implies the linker is expecting to link to a static version of Boost.Log.

If you want to link to the shared version, it seems you need to define BOOST_LOG_DYN_LINK or BOOST_ALL_DYN_LINK, i.e. in your CMakeLists.txt add:

ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK)

If you want to link to the static version of Boost.Log, instead you need to add a CMake variable before calling FIND_PACKAGE(Boost ...):

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

For further variables which affect how CMake finds Boost, see the docs for FindBoost.

这篇关于Boost.Log与CMake的不确定导致错误引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆