Cmake 带有“未定义的引用”尽管找到了增强库
cmake 2.8.12 正确显示:
Boost version: 1.56.0
Found the following Boost libraries:
system
thread
log
log_setup
生成的 link.txt 显示 .so 文件的完整、正确路径,但每个 Boost 调用只是“在函数中...未定义对 boost 的引用...”,没有 cxx11 或 ABI 或任何其他提示。
CMakeFiles/proj.dir/src/proj.cc.o: In function `proj::init()':
/code/proj/src/proj.cc:31: undefined reference to `boost::log::v2s_mt_posix::core::get()'
它在旧机器上运行,例如在 32 位处理器上使用 libc-2.13.so。我昨天在盒子上编译了 boost 库,并尝试在盒子上编译它,但一无所获。我也在盒子上编译了cmake。
在这里搜索几十个问题却一无所获。关于哪里出了问题有什么建议吗?如何调查问题?
set(PROJ_NAME my-proj)
set(HEADERS
headers/proj.h
)
set(SOURCES
src/proj.cc
)
set(MAIN_FILE src/main.cc)
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
add_executable (${PROJ_NAME} ${SOURCES}
${HEADERS} ${MAIN_FILE})
target_include_directories ( ${PROJ_NAME}
PUBLIC headers
PRIVATE .
PRIVATE /usr/local/lib/
)
set( Boost_LIBRARY_DIR /usr/local/lib )
find_package(Boost COMPONENTS system thread log log_setup REQUIRED)
link_directories(${Boost_LIBRARY_DIR})
target_link_libraries ( ${PROJ_NAME} -pthread ${Boost_LIBRARIES} )
cmake 2.8.12 correctly shows:
Boost version: 1.56.0
Found the following Boost libraries:
system
thread
log
log_setup
And the generated link.txt shows full, correct path to the .so files, but every Boost call is simply "In function...undefined reference to boost..." with no cxx11 or ABI or any other hints.
CMakeFiles/proj.dir/src/proj.cc.o: In function `proj::init()':
/code/proj/src/proj.cc:31: undefined reference to `boost::log::v2s_mt_posix::core::get()'
This is running on an old box, for example using libc-2.13.so on a 32bit processor. I compiled the boost libraries on the box yesterday and am trying to compile this on the box but am getting nowhere. I compiled cmake on the box as well.
Searching dozens of questions here has gotten me nowhere. Any suggestions on what is wrong? How to investigate the issue?
set(PROJ_NAME my-proj)
set(HEADERS
headers/proj.h
)
set(SOURCES
src/proj.cc
)
set(MAIN_FILE src/main.cc)
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
add_executable (${PROJ_NAME} ${SOURCES}
${HEADERS} ${MAIN_FILE})
target_include_directories ( ${PROJ_NAME}
PUBLIC headers
PRIVATE .
PRIVATE /usr/local/lib/
)
set( Boost_LIBRARY_DIR /usr/local/lib )
find_package(Boost COMPONENTS system thread log log_setup REQUIRED)
link_directories(${Boost_LIBRARY_DIR})
target_link_libraries ( ${PROJ_NAME} -pthread ${Boost_LIBRARIES} )
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为这
是错误的,并且会严重干扰 Find_Package。如果您想提供提示,请使用例如
BOOST_ROOT
如文档所述:这是一个有效的固定/简化的独立示例:
File
CMakeLists.txt
文件
headers/proj.h
文件
src/main.cc
文件
src/proj.cc
布丁的证明:
注释
请注意,如果您使用太新的Boost,那么依赖关系可能不正确:
在我的系统上,例如为了成功使用Boost 1.78,我必须手动添加Boost System。链接器错误:
修复:
I think that
is wrong and interferes badly with Find_Package. If you want to provide a hint, use e.g.
BOOST_ROOT
as documented:Here's a fixed-up / simplified self-contained example that works:
File
CMakeLists.txt
File
headers/proj.h
File
src/main.cc
File
src/proj.cc
Proof of the pudding:
NOTES
Note that if you use a too-recent boost then maybe the dependencies might be incorrect:
On my system, e.g. in order to use Boost 1.78 successfully, I have to add Boost System manually. Linker errors:
Fix:
我希望在这里放弃我的答案还为时不晚。
TLDR:当使用 Homebrew 或 macports 等包管理器安装 Boost 时,通常会使用 clang++ 进行编译。但在您的项目方面,可能会使用不同的编译器,从而导致链接阶段出现未定义的引用。
为了在项目中使用您想要使用的编译器,您必须使用使用相同编译器编译的 Boost 版本。要实现此目的,您可以在 Macos 上自定义 Boost 编译,如下所示:
./bootstrap.sh --prefix=/usr/local/Cellar/boost_gcc --with-toolset=gcc --without- Library=python,mpi
./b2 headers
using gcc : : /usr/local/bin/g++-11 ;
< code>./b2 -d2 -j12 --layout=tagged-1.66 --user-config=user-config.jam install threading=multi,single link=shared,static
我希望它有帮助。
I hope that it is not too late to drop my answer here.
TLDR: When Boost is installed using package managers such as Homebrew or macports often it is compiled using clang++. But on your project side, one might be using a different compiler, leading to undefined references in the linkage stage.
In order to use the compiler that you want to use in your project, you will have to use a version of Boost compiled with the same compiler. to achieve this you can customize Boost compilation on macos as follows:
./bootstrap.sh --prefix=/usr/local/Cellar/boost_gcc --with-toolset=gcc --without-libraries=python,mpi
./b2 headers
using gcc : : /usr/local/bin/g++-11 ;
./b2 -d2 -j12 --layout=tagged-1.66 --user-config=user-config.jam install threading=multi,single link=shared,static
I hope that it helps.