使用'find_package':我如何知道哪些变量必须用于链接?

时间:2018-04-16 13:14:41

标签: cmake

我使用find_package()找到一些库。我怎么知道它定义了哪些变量,所以我可以用它们来链接那个库?

例如,CMake成功运行了以下CMakeLists.txt,但make在链接阶段失败,因为${DOCOPT_LIBRARIES}为空。

cmake_minimum_required(VERSION 3.1)

project(test)

set(PROJECT_LIBS "")

find_package(docopt REQUIRED)
include_directories(${DOCOPT_INCLUDE_DIRS})
set(PROJECT_LIBS ${PROJECT_LIBS} ${DOCOPT_LIBRARIES})

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBS})

但我不知道还有什么可以尝试?

1 个答案:

答案 0 :(得分:1)

find_package(XXX)结果的使用取决于此命令实际使用的脚本:

  1. FindXXX.cmake

    此文件随想要使用它的项目一起提供,或与CMake一起提供。通常,这样的"查找"脚本首先描述了它们的用法。

  2. XXXConfig.cmakexxx-config.cmake

    "配置"脚本通常随包一起安装。通常,它们是由CMake使用特定的CMake commands生成的。您需要查阅软件包的文档以正确使用这些脚本。

  3. 如果包裹没有记录其使用的" Config"脚本,那么你可能只是猜测它的用法。

    阅读"配置"脚本本身可能很难:CMake包含很多" sugar",这有助于实现可移植性和兼容性。

    通常,"配置"脚本提供了一些 IMPORTED 库目标,可以与target_link_libraries调用一起使用。

    有人可能会扫描项目CMakeLists.txt以获取

    这样的行
    install(TARGETS <targets...> EXPORT ...)
    

    此处<targets...>表示目标,可在find_package()调用后访问。

    同时扫描类似

    的行
    install(EXPORT ...)
    

    如果它有 NAMESPACE 选项,那么它的值会预先包含所有导出的目标。

    示例

    对于docopt包,其CMakeLists.txt包含一行

    install(TARGETS docopt EXPORT ${export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})
    

    因此导出其docopt目标。

    安装导出文件

    install(EXPORT ${export_name} DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/docopt")
    

    不包含NAMESPACE选项,可以使用原始名称访问导出目标:

    find_package(docopt REQUIRED)
    ...
    add_executable(${PROJECT_NAME} main.cpp)
    # Use *IMPORTED* 'docopt' target
    target_link_libraries(${PROJECT_NAME} docopt)