当尝试使用boost进行编译时,所有内容都适用于Windows,但是当我尝试使用linux进行编译时,似乎使用SET
命令给出的配置不会被FindBoost考虑。
执行以下操作时,
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED OFF)
find_package(Boost COMPONENTS system REQUIRED)
if (Boost_FOUND)
MESSAGE(${Boost_SYSTEM_LIBRARY})
endif ()
输出为/usr/lib/libboost_system-mt.a
,似乎是库中的静态和多线程版本。我做错了什么?
答案 0 :(得分:2)
如果查看FindBoost.cmake指定Boost_USE_STATIC_LIBS为OFF,则使用默认后缀值进行搜索(CMAKE_FIND_LIBRARY_SUFFIXES),而不是覆盖它们。在我的linux机器上
MESSAGE(${CMAKE_FIND_LIBRARY_SUFFIXES})
返回
.so.a
所以
set(Boost_USE_STATIC_LIBS OFF)
提供一个提示,导致.so文件优先于.a但如果找不到匹配的.so则会包含它们。在这种情况下,问题是您很可能没有安装共享对象,或者它们安装在FindBoost.cmake没有查找的地方。要使用
解决此重新运行的cmakecmake -DBoost_DEBUG=ON
并查看输出以查看cmake在哪里查找boost库,然后检查这些位置以查看.so文件是否确实存在。如果它们存在,请确保它们的命名方式与您设置的提示相符,例如: libboost_system-mt.so将不匹配,因为您指定多线程应该关闭。
关于多线程,使用linux发行版时,没有“-mt”的libs有时只是带有“-mt”的libs的符号链接,所以如果将Boost_USE_MULTITHREADED设置为OFF将导致链接多线程库。