我有一个大型项目,其中包含多个构建目标,它们之间具有依赖性。结构类似于这样:
Application <-- Library I <--- Library II
<-- Library III <---|
<-- Library IV
存在多个此类应用程序,它们使用分布在不同库中的共享代码。
在项目中,CMake用于确保正确的包含路径和各种库之间的链接。
使用add_library(“ Library II”)设置库,随后另一个项目使用target_link_libraries(“ Library I”“ Library II”)获得依赖项。
这在大多数情况下都有效。但是,有时找不到某些依赖项。我怀疑在某些情况下“图书馆I”是未知的。但是,如果不知道库,target_link_libraries()不会引发错误。该错误仅在编译/链接时出现。
我想在运行cmake时验证是否已找到所有库。如果在那个阶段尚不知道某事,我想抛出一个错误并通知开发人员。
我尝试使用find_libraries(),但据我了解,这会查找某个文件。但是,就我而言,该文件仅在编译阶段进行编译,因此在运行cmake时该文件不存在。
答案 0 :(得分:0)
检查库目标,而不是文件:
if(not TARGET library_2)
message(SEND_ERROR "Attempt to link to non-existent library 'library_2'.")
endif()
target_link_libraries(library_1 library_2)
另请参阅that question有关检查目标的信息。
请注意,这种方法仅在以下情况下有效
add_library(library_2)
先于
target_link_libraries(library_1 library_2)
CMake允许(并正确处理)相反的顺序,但是我发现在库创建和链接之间要求直接顺序是一种很好的样式。