添加不存在的目标时强制 CMake target_link_libraries 失败

NoS*_*tAl 6 c++ cmake target-link-libraries

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

项目(堆栈溢出)

// 另一个 CMakeLists.txt

项目(东西)

target_link_libraries(Stuff PUBLIC StackOverlow)

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

squ*_*les 1

In CMake, you do not link projects to other projects. Instead, you link targets to other targets.

CMake targets are only created via a few commands (such as add_library, add_executable, and add_custom_target). The project command does not create a CMake target, it merely declares a project.

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

  • 库目标名称
  • 库文件的完整路径
  • 简单的库名称
  • 链接标志
  • 生成器表达式
  • debugoptimizedgeneral关键字

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

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

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

if (TARGET StackOverflow)
    target_link_libraries(Stuff PUBLIC StackOverflow)
endif()
Run Code Online (Sandbox Code Playgroud)

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