FindPackageHandleStandardArgs 到底做了什么?

sha*_*WWW 6 cmake cmake-modules

我正在尝试为我已安装的软件包编写查找模块。但我在理解 CMake 函数时遇到了困难。

\n\n

这是我的代码片段。

\n\n
find_package(PkgConfig)\npkg_check_modules(PC_zcm QUIET zcm)\n\nfind_path(zcm_INCLUDE_DIR\n        NAMES zcm.h\n        PATHS $ENV{PATH}\n        )\nmark_as_advanced(zcm_FOUND zcm_INCLUDE_DIR)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(zcm DEFAULT_MSG\n        REQUIRED_VARS zcm_INCLUDE_DIR\n        )\n
Run Code Online (Sandbox Code Playgroud)\n\n

find_path()能够找到我的zcm_INCLUDE_DIR就好了:/usr/bin/zcm/usr/local/include

\n\n

但 find_package_handle_standard_args() 给出 \n-- Could NOT find zcm (missing: REQUIRED_VARS)

\n\n

我的目录树如下所示:

\n\n
\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 zcm\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 eventlog.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 json\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 json-forwards.h\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 json.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 message_tracker.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tools\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 IndexerPlugin.hpp\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 TranscoderPlugin.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 generic_serial_transport.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport_register.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 transport_registrar.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 url.h\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 util\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Filter.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 zcm-cpp-impl.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 zcm-cpp.hpp\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 zcm.h\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 zcm_coretypes.h\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的理解是find_package_handle_standard_args()尝试在路径中找到包,这听起来很简单,因为路径已经确定。

\n\n

至于REQUIRED_VARS文档只是说“指定这个包所需的变量”。对于像我这样的菜鸟来说,这并不能说明什么。

\n

Tsy*_*rev 3

find_package_handle_standard_args的描述记录了给定函数的两个签名,一个签名接受DEFAULT_MSG选项,另一个签名接受REQUIRED_VARS选项。

你试图混合这些签名,这是错误的。

第一个签名的正确用法:

# Everything after DEFAULT_MSG is treated as required variable.
find_package_handle_standard_args(zcm DEFAULT_MSG
    zcm_INCLUDE_DIR
    )
Run Code Online (Sandbox Code Playgroud)

第二个签名的正确用法:

# By default, the standard error message is used.
find_package_handle_standard_args(zcm REQUIRED_VARS
    zcm_INCLUDE_DIR
    )
Run Code Online (Sandbox Code Playgroud)