如何使用cmake的target_link_libraries链接与glob匹配的库?

时间:2014-07-28 10:53:11

标签: cmake glob

我有预建的第三方库(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库的目录结构,你会如何解决这个问题?

2 个答案:

答案 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)

有两种可能性。

  1. 不鼓励使用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"
      ...
    )
    
  2. 第二种解决方案是使用您提出的建议。这些方面应该有用:

    file(GLOB LIBS "${BOOST_PATH}/libboost*.a")
    target_link_libraries(${TARGET} PRIVATE ${LIBS})