如何得到 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
函数。
我正在将“现代 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
函数。