C++ 如何使用 cmake 链接 boost.system
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1065672/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to link against boost.system with cmake
提问by Janusz
I use a cmake generated makefile to compile a c++ file that depends on the boost filesystem library.
我使用 cmake 生成的 makefile 来编译依赖于 boost 文件系统库的 c++ 文件。
During the linking process I get the following error:
在链接过程中,我收到以下错误:
Undefined symbols: "boost::system::get_generic_category()", referenced from: __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o "boost::system::get_system_category()", referenced from: __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o ld: symbol(s) not found collect2: ld returned 1 exit status make[2]: *** [src/ImageMarker] Error 1
The action from the makefile that generates this error is this line:
生成此错误的 makefile 中的操作是这一行:
cd /Users/janusz/Documents/workspace/ImageMarker/Debug/src && /opt/local/bin/cmake -E cmake_link_script CMakeFiles/ImageMarker.dir/link.txt --verbose=1 /usr/bin/c++ -O3 -Wall -Wno-deprecated -g -verbose -Wl,-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/ImageMarker.dir/ImageMarker.cpp.o CMakeFiles/ImageMarker.dir/Image.cpp.o CMakeFiles/ImageMarker.dir/utils.cpp.o CMakeFiles/ImageMarker.dir/XMLWriter.cpp.o CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o -o ImageMarker -L/opt/local/lib ../libTinyXml.a /opt/local/lib/libboost_filesystem-mt.dylib
Some googling showed me that this error seems to be common on macs with the boost file system library because I have to link against a boost.system library or make my project depending on the boost.system library.
一些谷歌搜索告诉我这个错误在带有 boost 文件系统库的 Mac 上似乎很常见,因为我必须链接到 boost.system 库或根据 boost.system 库创建我的项目。
How do i force cmake to link against the library without hardcoding the library path?
我如何强制 cmake 链接到库而不对库路径进行硬编码?
Here the result from otool:
这是 otool 的结果:
otool -L /opt/local/lib/libboost_filesystem-mt.dylib
/opt/local/lib/libboost_filesystem-mt.dylib:
/opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
回答by Maik Beckmann
On linux CMake figures itself that boost_filesystem is linked against boost_system. Obviously you have to tell it explicitly on Mac:
在 linux 上,CMake 认为 boost_filesystem 与 boost_system 相关联。显然你必须在 Mac 上明确地告诉它:
find_package(Boost COMPONENTS system filesystem REQUIRED)
#...
target_link_libraries(mytarget
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
)
回答by galactica
This is not an "answer" to the posted question, but an observation on my Ubuntu box.
这不是对已发布问题的“答案”,而是对我的 Ubuntu 机器的观察。
To use the Boost libs, you have to explicitly write something like this:
要使用 Boost 库,您必须明确地编写如下内容:
find_package(Boost COMPONENTS regex system filesystem REQUIRED)
In addition, you need to link it this way:
此外,您需要以这种方式链接它:
target_link_libraries(binary
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_REGEX_LIBRARY}
)
and the following way didn't work, at least for me:
并且以下方式不起作用,至少对我而言:
target_link_libraries(binary regex system filesystem)
This follows what Maik says, but not only on Mac.
这遵循 Maik 所说的,但不仅仅是在 Mac 上。