2

CMake 有一个令人讨厌的默认值(我想,我在我的 CMake 配置中没有看到任何神奇之处,但我可能是错的,因为我对 CMake 知之甚少)当你将目标添加到项目时,他会默默地忽略该行为,即使该目标没有存在,例如:

项目(堆栈溢出)

// 另一个 CMakeLists.txt

项目(东西)

target_link_libraries(Stuff PUBLIC StackOverlow )

有没有办法强制 CMake 检查您链接的所有项目是否target_link_libraries必须存在?

4

2 回答 2

1

在 CMake 中,您不会将项目链接到其他项目。相反,您将目标链接到其他目标。

CMake 目标通过几个命令(例如add_libraryadd_executableadd_custom_target)创建。该project命令不会创建 CMake 目标,它只是声明一个项目。

此外,该target_link_libraries()命令在作用域关键字之后接受以下参数:

  • 库目标名称
  • 库文件的完整路径
  • 一个简单的库名称
  • 链接标志
  • 生成器表达式
  • 一个debug, optimized, 或general关键字

它不接受项目名称,但如果您输入项目名称,它会在您的系统上查找具有该名称的 CMake目标或库文件。

要找到我认为您要问的问题的根源:如果您提供的链接项名称target_link_libraries()与现有目标不匹配,则该命令将简单地搜索该名称的库文件

要在尝试链接之前检查目标是否存在,您可以执行以下操作:

if (TARGET StackOverflow)
    target_link_libraries(Stuff PUBLIC StackOverflow)
endif()

target_link_libraries()如果您想了解有关此命令功能的更多详细信息,我建议您阅读链接的文档。

于 2020-05-08T15:17:00.357 回答
1

如果链接 ALIAS 目标,CMake 可能会失败。例如

在第一个 CMakeLists.txt

add_library(StackOverflow STATIC lib.cpp)
add_library(StackOverflow::StackOverflow ALIAS StackOverflow)

在第二个 CMakeLists.txt

target_link_libraries(Stuff PUBLIC StackOverflow::StackOverflow)

如果未定义 StackOverflow::StackOverflow,CMake 将失败并出现错误。

https://cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#alias-targets

于 2020-05-11T11:25:04.797 回答