【问题标题】:Verify library is available before target_link_libraries in CMake Script在 CMake 脚本中的 target_link_libraries 之前验证库是否可用
【发布时间】:2019-05-21 15:15:02
【问题描述】:

我有一个由多个构建目标组成的大型项目,它们之间存在依赖关系。结构是这样的:

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    检查库目标,而不是文件:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 2011-07-20
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多