4

我正在尝试为已安装的软件包编写查找模块。但我无法理解 CMake 函数。

这是我的代码片段。

find_package(PkgConfig)
pkg_check_modules(PC_zcm QUIET zcm)

find_path(zcm_INCLUDE_DIR
        NAMES zcm.h
        PATHS $ENV{PATH}
        )
mark_as_advanced(zcm_FOUND zcm_INCLUDE_DIR)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(zcm DEFAULT_MSG
        REQUIRED_VARS zcm_INCLUDE_DIR
        )

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

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

我的目录树如下所示:

└── zcm
    ├── eventlog.h
    ├── json
    │   ├── json-forwards.h
    │   └── json.h
    ├── message_tracker.hpp
    ├── tools
    │   ├── IndexerPlugin.hpp
    │   └── TranscoderPlugin.hpp
    ├── transport
    │   └── generic_serial_transport.h
    ├── transport.h
    ├── transport_register.hpp
    ├── transport_registrar.h
    ├── url.h
    ├── util
    │   └── Filter.hpp
    ├── zcm-cpp-impl.hpp
    ├── zcm-cpp.hpp
    ├── zcm.h
    └── zcm_coretypes.h

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

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

4

1 回答 1

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
    )

正确使用第二个签名:

# By default, the standard error message is used.
find_package_handle_standard_args(zcm REQUIRED_VARS
    zcm_INCLUDE_DIR
    )
于 2018-10-13T17:53:36.653 回答