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

Gab*_*ton 3 glob cmake

我有预建的第三方库(Boost),我想链接到我的目标.所有这些都存储在一个目录下,如$ {BOOST_PATH} /lib/libboost_thread.a,$,BOOST_PATH} /lib/libboost_log.a等.所以我想做这样的事情: target_link_libraries(${TARGET} PRIVATE "${BOOST_PATH}/libboost*.a") 我读过那个文件( GLOB ......)可能会被使用,但强烈反对.我不确定它会起作用.为什么?如果无法更改Boost库的目录结构,您将如何解决此问题?

Sir*_*ius 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})
Run Code Online (Sandbox Code Playgroud)

这假定标准安装Boost,具有默认目录布局.

我不认为通配是一个好主意,因为你可能不依赖于所有 Boost编译库,并且你会毫无理由地使链接速度变慢.

即使你这样做,明确地列出依赖关系仍然是一个好主意.


Jan*_*egg 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"
      ...
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二种解决方案是使用您提出的建议.这些方面的东西应该有效:

    file(GLOB LIBS "${BOOST_PATH}/libboost*.a")
    target_link_libraries(${TARGET} PRIVATE ${LIBS})
    
    Run Code Online (Sandbox Code Playgroud)