3

尝试使用 boost 编译时,Windows 上一切正常,但是当我尝试使用 linux 编译时,SETFindBoost 似乎没有考虑使用命令给出的配置。

执行以下操作时,

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似乎是库中的静态和多线程版本。我究竟做错了什么 ?

4

1 回答 1

3

如果您查看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 不查找的地方。要解决此重新运行 cmake

cmake -DBoost_DEBUG=ON 

并查看输出以查看 cmake 在哪里寻找 boost 库,然后检查这些位置以查看 .so 文件是否实际存在。如果它们存在,请确保它们的命名方式与您设置的提示匹配,例如 libboost_system-mt.so 将不匹配,因为您指定应该关闭多线程。

关于多线程,对于 linux 发行版,没有“-mt”的库有时只是带有“-mt”的库的符号链接,所以如果是这种情况,将 Boost_USE_MULTITHREADED 设置为 OFF 将导致链接多线程库。

于 2012-12-14T13:50:24.820 回答