为何CMake中未定义的MBEDTLS变量会被赋值为NOTFOUND?
关于CMake中MBEDTLS相关变量的疑问
我创建了一个空的CMake项目,并添加了以下代码:
message(WARNING "Non existent var = ${NON_EXISTENT_VAR}") message(WARNING "MBEDTLS INCLUDE DIR = ${MBEDTLS_INCLUDE_DIR}") message(WARNING "MBEDTLS_LIBRARY = ${MBEDTLS_LIBRARY}") message(WARNING "MBEDX509_LIBRARY = ${MBEDTLS_LIBRARY}") message(WARNING "MBEDCRYPTO_LIBRARY = ${MBEDTLS_LIBRARY}")
执行后得到如下输出:
[cmake] CMake Warning at CMakeLists.txt:40 (message): [cmake] Non existent var = [cmake] [cmake] [cmake] CMake Warning at CMakeLists.txt:41 (message): [cmake] MBEDTLS INCLUDE DIR = MBEDTLS_INCLUDE_DIR-NOTFOUND [cmake] [cmake] [cmake] CMake Warning at CMakeLists.txt:42 (message): [cmake] MBEDTLS_LIBRARY = MBEDTLS_LIBRARY-NOTFOUND [cmake] [cmake] [cmake] CMake Warning at CMakeLists.txt:43 (message): [cmake] MBEDX509_LIBRARY = MBEDTLS_LIBRARY-NOTFOUND [cmake] [cmake] [cmake] CMake Warning at CMakeLists.txt:44 (message): [cmake] MBEDCRYPTO_LIBRARY = MBEDTLS_LIBRARY-NOTFOUND
疑问解答
MBEDTLS_LIBRARY这类变量不是CMake自动定义的。你看到的XXX-NOTFOUND是CMake的特殊标记:当调用find_package(MbedTLS)、find_library或find_path这类查找命令但未找到目标时,CMake会将对应变量设置为XXX-NOTFOUND,标记查找失败。- 你的空项目里没手动调用查找命令,但可能是CMake内置模块、或者环境中的全局配置脚本触发了相关查找逻辑,导致这些变量被创建并赋值为NOTFOUND。
- CMake本身不会自动为常见软件包预定义变量,只有显式调用查找命令时才会创建对应变量。未被定义的变量(比如
NON_EXISTENT_VAR)在输出时会是空值,这和被标记为NOTFOUND的变量有明显区别。 - 另外注意代码中的笔误:
MBEDX509_LIBRARY和MBEDCRYPTO_LIBRARY都错误引用了${MBEDTLS_LIBRARY},所以它们的输出和MBEDTLS_LIBRARY一致,这是代码写法错误导致的,并非变量本身的问题。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

