【问题标题】:Cmake and vcpkg - find the correct library nameCmake 和 vcpkg - 找到正确的库名称
【发布时间】:2019-03-16 20:59:52
【问题描述】:

对于使用 vcpkg 安装的软件包,我很难找到要在 cmake 文件中使用的正确“库目标名称”。

例如,我使用vcpkg install gtest 安装了gtest 包。我的示例 cmake 文件如下所示:

#CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(example)
add_executable(main main.cpp)
find_package(gtest REQUIRED)
target_link_libraries(main gtest) # here, "gtest" is not the right name! 

运行cmake,生成Visual Studio的解决方案,但运行cmake --build .后,报错:

../use-cmake-vcpkg\main.cpp(1): fatal error C1083: Cannot open include file: 'gtest/gtest.h': No such file or directory ..

原来这行:target_link_libraries(main gtest) 不正确,我需要使用另一个“名称”来包含/链接 gtest 包。

有没有办法(使用 cmake 或 vcpkg)找出要使用的正确目标名称是什么? (在这种情况下适用于 gtest,但也适用于任何其他包装?)

【问题讨论】:

    标签: cmake vcpkg


    【解决方案1】:

    当使用find_package(XXX)时,它可以工作在两种模式:MODULECONFIG。此调用的结果变量和目标取决于模式

    如果FindXXX.cmake 文件存在(并且可以找到),则使用MODULE 模式并处理给定的文件。否则,如果软件包附带XXXConfig.cmake 文件,则使用CONFIG 模式并处理给定的文件。如果此文件不存在,CMake 会发出错误(如果使用 REQUIRED 关键字调用)或警告(不带 REQUIRED 关键字)。

    如果是gtest 包,CMake 附带FindXXX.cmake 脚本,所以这个脚本在MODULE 模式下处理。你可以在documentation 找到这个脚本的描述,它告诉你需要使用GTest::GTest 目标来链接gtest:

    target_link_libraries(main GTest::GTest)
    

    【讨论】:

    • GTest::Main,如果您正在构建可执行文件