Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 与';查找包';:我如何知道链接必须使用哪些变量?_Cmake - Fatal编程技术网

Cmake 与';查找包';:我如何知道链接必须使用哪些变量?

Cmake 与';查找包';:我如何知道链接必须使用哪些变量?,cmake,Cmake,我使用find_package()查找一些库。我如何知道它定义了哪些变量,以便我可以使用它们来链接该库 例如,CMake成功运行了以下CMakeLists.txt,但是make在链接阶段失败,因为${DOCOPT\u LIBRARIES}为空 cmake_minimum_required(VERSION 3.1) project(test) set(PROJECT_LIBS "") find_package(docopt REQUIRED) include_directories(${DO

我使用
find_package()
查找一些库。我如何知道它定义了哪些变量,以便我可以使用它们来链接该库

例如,CMake成功运行了以下
CMakeLists.txt
,但是
make
在链接阶段失败,因为
${DOCOPT\u 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})

但是我不知道还能尝试什么?

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

  • FindXXX.cmake

    此文件随要使用它的项目一起提供,或随CMake一起提供。通常,这样的“查找”脚本以一些关于其用法的描述开始

  • XXXConfig.cmake
    xxx config.cmake

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

  • 如果包没有记录其“Config”脚本的用法,那么您可能只能猜测它的用法

    阅读“配置”脚本本身可能很困难:CMake包含了很多“糖”,这有助于移植性和兼容性

    通常,“配置”脚本提供一些导入的库目标,可与
    target\u link\u库调用一起使用

    可以扫描项目的
    CMakeLists.txt
    以查找类似

    install(TARGETS <targets...> EXPORT ...)
    
    install(EXPORT ...)
    
    如果它有NAMESPACE选项,则其值在所有导出目标之前

    示例

    对于docopt包,其包含一行

    install(TARGETS docopt EXPORT ${export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})
    
    因此,它的
    docopt
    目标被导出

    作为导出文件的安装

    install(EXPORT ${export_name} DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/docopt")
    
    不包含命名空间选项,可以使用其原始名称访问导出目标:

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

    定义“链接失败”。实际的错误是什么?链接命令
    cmake
    试图使用什么(
    make VERBOSE=1
    将打印它)?@StephenNewell感谢您指出我描述中的缺点。我编辑过。
    make VERBOSE=1
    的相关输出是
    c++-O3-DNDEBUG-Wl,-search\u paths\u first-Wl,-headerpad\u max\u install\u names CMakeFiles/test.dir/main.cpp.o-o test