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()'
这是在一个旧的机器上运行的,例如libc-2.13.so在32位处理器上使用www.example.com。昨天我在机器上编译了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} )
2条答案
按热度按时间sbdsn5lh1#
我认为
是错误的,会严重干扰Find_Package。如果要提供提示,请使用例如
BOOST_ROOT
,如下所示:下面是一个经过修正/简化的自包含示例:
CMakeLists.txt
headers/proj.h
src/main.cc
src/proj.cc
布丁的证明:
注解
请注意,如果您使用的提升时间太晚,则依赖关系可能不正确:
在我的系统上,例如,为了成功使用Boost 1.78,我必须手动添加Boost系统。链接器错误:
修复:
fdbelqdn2#
我希望现在在此作答还不算太晚。
TLDR:当Boost是使用软件包管理器(如Homebrew或macports)安装的时候,它通常是使用clang++编译的。但是在您的项目端,可能会使用不同的编译器,导致在链接阶段出现未定义的引用。
为了使用您希望在项目中使用的编译器,您必须使用使用相同编译器编译的Boost版本。要实现这一点,您可以在macos上自定义Boost编译,如下所示:
1.在Bootstrap阶段,用途:
./bootstrap.sh --prefix=/usr/local/Cellar/boost_gcc --with-toolset=gcc --without-libraries=python,mpi
1.按以下步骤安装仅限接头的部件:
./b2 headers
个1.通过添加一个名为user-config.jam的文件(其中包含以下行),定制编译器以构建库:
using gcc : : /usr/local/bin/g++-11 ;
1.编译并安装程式库,如下所示:
./b2 -d2 -j12 --layout=tagged-1.66 --user-config=user-config.jam install threading=multi,single link=shared,static
我希望能有所帮助。