如何测试CMake是否找到了一个包含find_library的库

sig*_*hol 24 cmake

我找到了具有该find_library功能的库

find_library(MY_LIB lib PATHS ${MY_PAHT})
Run Code Online (Sandbox Code Playgroud)

如果找到库,${MY_LIB}将指向正确的位置.如果未找到库,${MY_LIB}则会MY_LIB-NOTFOUND.

但是我该如何测试呢?

if(${MY_LIB} EQUAL 'MY_LIB-NOTFOUND') 
    ...
endif()
Run Code Online (Sandbox Code Playgroud)

总是评估为假.

max*_*zig 31

您可以简单地测试变量,例如:

find_library(LUA_LIB lua)
if(NOT LUA_LIB)
  message(FATAL_ERROR "lua library not found")
endif()
Run Code Online (Sandbox Code Playgroud)

示例输出:

CMake Error at CMakeLists.txt:99 (message):
  lua library not found


-- Configuring incomplete, errors occurred!
Run Code Online (Sandbox Code Playgroud)

请注意,我们使用

if(NOT LUA_LIB)
Run Code Online (Sandbox Code Playgroud)

并不是

if(NOT ${LUA_LIB})
Run Code Online (Sandbox Code Playgroud)

因为语义不同.

在评估之前${},变量LUA_LIB被替换if().作为评估的一部分,内容将被解释为变量名称,除非它与常量的定义匹配.这不是我们想要的.


NaC*_*aCl 8

简单地做

if(MY_LIB)
    #found
    ...
else()
    #not found
    ...
endif()
Run Code Online (Sandbox Code Playgroud)

  • @NaCl`if`中的`$ {}`真的应该消失.我解释了将它们留在[这个答案]中的含义(http://stackoverflow.com/a/25809646/577603).问题非常微妙,在99%的情况下,它没有什么区别,但是当它发生时,你通常会花半天时间调试它. (9认同)
  • @sighol特别注意[if命令的文档](http://www.cmake.org/cmake/help/v3.2/command/if.html):*如果常量为0,则为假,OFF, NO,FALSE,N,IGNORE,NOTFOUND,空字符串或***以后缀-NOTFOUND**结尾. (4认同)
  • 当我写"if(MY_LIB)"时,它起作用了. (2认同)