【问题标题】:CMake: "add_library IMPORTED" check if the lib existsCMake:“add_library IMPORTED”检查库是否存在
【发布时间】:2017-06-24 14:23:04
【问题描述】:

我正在使用add_library 在 CMAKE 中导入一个静态库。 该库导入正常。但我也想验证这一点。所以我这样做:

add_library(MYLIB STATIC IMPORTED)
set_target_properties(MYLIB PROPERTIES IMPORTED_LOCATION path/to/mylib.a)
#if(NOT  MYLIB)
  #  message(FATAL_ERROR "MYLIB library not found")
#endif()

即使路径正确并且库导入正常,它总是返回 false。如何检查库是否已导入?

使用 Cmake 3.4.1

【问题讨论】:

  • 请在您的问题中添加 Android NDK 标签。许多人避免回答他们不知道的平台的问题,在这种情况下,您甚至无法接受我正确的标准 CMake 答案。

标签: android-ndk cmake


【解决方案1】:

命令add_library() 创建一个目标,而不是一个变量

可以使用TARGET关键字检查目标是否存在:

add_library(MYLIB STATIC IMPORTED)
#...

if(NOT TARGET MYLIB)
   # Target is not exist
endif()

请注意,库目标的存在并不意味着文件的存在。文件的存在应该使用EXISTS关键字:

if(EXISTS <path>)

【讨论】:

    【解决方案2】:

    由于您无论如何都失败/停止处理,那么您可以通过尝试使用库来检查它是否已导入!

    如果您确实想在导入之前进行检查,那么这样的事情可能是合适的:

    find_library(MYLIB
      NAMES mylib
      PATHS
        path/to/mylib.a
      DOC "Find library mylib"
      NO_DEFAULT_PATH)
    
    if(NOT MYLIB)
      message(FATAL_ERROR "MYLIB library not found")
    endif()
    

    如果您不介意 CMake 在搜索您声明的路径之前先查看所有许多默认位置,则可以删除 NO_DEFAULT_PATH

    【讨论】:

    • 我忘了提——我不是故意使用“查找库”。 Android NDK 使使用该方法定位非 NDK 库变得非常痛苦,因为它们将默认搜索路径设置为某些内部 NDK 目录。这就是我切换到 add_library 的原因......另外我想吐出一条明确的错误消息,即找不到 lib。您可能知道,有时,工具最终用户并不像我们想象的那么聪明,无法找出问题的根源;)
    • @Michael Ivanov 然后我可以建议的唯一其他选择是使用IF(EXISTS path/to/mylib.a)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2012-07-15
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多