如何得到 target_link_libraries throw miss or errors

How to get target_link_libraries throw miss or errors

我正在将“现代 cmake”与包一起使用,并希望在 target_link_libraries 缺少库时出现错误。

我有一个CMakeLists.txt

add_library(libB
    sourceB.cpp
)
target_link_libraries(libB
    PRIVATE libC
)

这个在另一个目录中

add_library(libC
    sourceC.cpp
)

target_include_directories(libC
    PUBLIC include # Will provide include/sourceC.h
)

在 sourceB.cpp 中,我包括 sourceC.h

这里我忘记将 add_subdirectory 添加到 libC,所以当我构建时,我得到这个错误:

sourceB.cpp:2:10: fatal error: sourceC.h: No such file or directory

我可以让 cmake 抛出一个未命中错误,而不是这个编译时错误,因为我特别要求 link 使用 libC 但从未给过他 libC 吗?

我看到了 add_dependencies 但不一定要在 libB 之前构建 libC

谢谢

一个简单的解决方案是检查它是否是一个目标。可能在文件末尾的某处,至少在 add_subdirectory(libC)

之后
if(NOT TARGET libC)
  message(FATAL_ERROR "Och nuu, libC is not a target")
endif()

一个很好的解决方案是实现一个target_link_targets功能,它只允许与目标链接。虽然听起来微不足道,但并不是那么容易——静态库可以循环链接,也可以在定义之前链接。因此,在我们知道每个目标都已定义后,您必须检查是否所有目标都位于 CMake 文件的末尾。

我做了这样的实现,my implementation is available here。函数 k_target_link_targets 检查是否所有参数都是目标。从 CMake 3.19.0 开始,它使用 cmake_language(DEFER 将检查函数的执行推迟到 CMake 脚本的末尾,在 3.19.0 之前,需要在 CMake 文件末尾手动调用 k_target_link_targets_check 函数。