关于C#:当添加不存在的目标时,强制CMake target_link_libraries失败

Force CMake target_link_libraries to fail when adding nonexistent target

CMake有一个令人讨厌的默认值(我想我的CMake配置中没有什么神奇的东西,但是我可能对我不了解,因为我对CMake知之甚少),当您向项目中添加目标时,他默默地忽略了该行为。目标不存在,例如:

project(StackOverflow)

// another CMakeLists.txt

project (Stuff)

target_link_libraries(Stuff
PUBLIC StackOverlow )

是否可以强制CMake检查您在target_link_libraries中链接的所有项目是否必须存在?


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

在第一个CMakeLists.txt中

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

在第二个CMakeLists.txt中

1
target_link_libraries(Stuff PUBLIC StackOverflow::StackOverflow)

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

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


在CMake中,您不将项目链接到其他项目。而是将目标链接到其他目标。

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

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

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

它不接受项目名称,尽管如果您输入项目名称,它会在系统上使用该名称查找CMake目标或库文件。

要想知道我在想什么,请问:如果为target_link_libraries()提供与现有目标不匹配的链接项名称,该命令将仅搜索该名称的库文件。

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

1
2
3
if (TARGET StackOverflow)
    target_link_libraries(Stuff PUBLIC StackOverflow)
endif()

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