【问题标题】:Why cmake shows message when it should not? [duplicate]为什么cmake不应该显示消息? [复制]
【发布时间】:2022-01-23 07:28:48
【问题描述】:

找到了fltk,但是测试没有通过,为什么?

定义一个简单的宏

macro(assert TEST COMMENT)
  message(${TEST})
  if(NOT ${TEST})
    message("Assertion failed: ${COMMENT}")
  endif()
endmacro()

# use the macro
find_library(FLTK_LIB fltk)
assert(${FLTK_LIB} "Unable to find library fltk")

输出:

/usr/lib/x86_64-linux-gnu/libfltk.so
Assertion failed: Unable to find library fltk

【问题讨论】:

    标签: cmake


    【解决方案1】:
    if( NOT ${TEST} )
    

    你在扩展TEST这里,也就是说你基本上是在说......

    if( NOT "/usr/lib/x86_64-linux-gnu/libfltk.so" )
    

    CMake docs on if 声明:

    if(<string>)

    带引号的字符串总是计算为假,除非:

    • 字符串的值是真正的常量之一 [...]

    所以默认为假,真常量为:

    [...] 1、ON、YES、TRUE、Y 或非零数。

    你的字符串两者都不是,所以它是假的,所以你的断言总是触发。

    如果你在function,解决办法就是写...

    if( NOT TEST )
    

    ...因为这不会测试字符串,而是文档说明的变量...

    if(<variable>)

    如果给定一个定义为非假常量值的变量,则为真。否则为 False,包括变量未定义时。

    所以默认为真,除非您的变量未定义或假常量之一...

    0、OFF、NO、FALSE、N、IGNORE、NOTFOUND,空字符串,或以-NOTFOUND后缀结尾

    不幸的是,您将断言编写为宏,而不是函数。不幸的是,因为...

    请注意,宏参数不是变量。

    此时,我个人会留意我的 C/C++ 程序员基因“宏是邪恶的”,并建议您将您的 assert() 变成 function 并写成 if( NOT TEST )。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多