我有预建的第三方库(Boost),我想链接到我的目标。所有这些都存储在一个目录下,如$ {BOOST_PATH} /lib/libboost_thread.a, $ {BOOST_PATH} /lib/libboost_log.a等。
所以我想做这样的事情:
target_link_libraries(${TARGET} PRIVATE "${BOOST_PATH}/libboost*.a")
我读过FILE(GLOB...)可能会被使用,但强烈反对。我不确定它会起作用。为什么?
如果你不能改变Boost库的目录结构,你会如何解决这个问题?
答案 0 :(得分:12)
或者您可以使用CMake内置功能与Boost链接,例如:
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.55.0 REQUIRED thread system log)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(${TARGET} ${Boost_LIBRARIES})
这假定标准安装Boost,使用默认目录布局。
我认为通配不是一个好主意,因为你可能不依赖于所有 Boost编译库,并且你会毫无理由地使链接速度变慢。
即使你这样做,明确地列出依赖关系仍然是一个好主意。
答案 1 :(得分:6)
有两种可能性。
不鼓励使用glob,因为如果在此文件夹中添加新的boost库,则CMake不会自动检测到此。您必须手动重新运行CMake以获取新库。但是,除了以某种方式在每次构建调用时都执行glob时,没有其他的globbing解决方案可以防止这个问题。所以你能做的就是列出所有文件:
target_link_libraries(${TARGET} PRIVATE
"${BOOST_PATH}/libboost_filesystem.a"
"${BOOST_PATH}/libboost_system.a"
"${BOOST_PATH}/libboost_chrono.a"
...
)
第二种解决方案是使用您提出的建议。这些方面应该有用:
file(GLOB LIBS "${BOOST_PATH}/libboost*.a")
target_link_libraries(${TARGET} PRIVATE ${LIBS})