验证库在CMake脚本中的target_link_libraries之前可用

时间:2019-05-21 15:15:03

标签: cmake

我有一个大型项目,其中包含多个构建目标,它们之间具有依赖性。结构类似于这样:

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时该文件不存在。

1 个答案:

答案 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允许(并正确处理)相反的顺序,但是我发现在库创建和链接之间要求直接顺序是一种很好的样式。