在外部项目上使用 find_package()

Bha*_*ran 9 cmake

我有一个名为 的外部项目messages。我正在使用ExternalProject_Add 来获取和构建项目。

如果我find_package(messages REQUIRED)在顶级 CMakeLists.txt 中使用cmake ..,则会失败,因为它找不到包安装文件,这是合乎逻辑的,因为它们仅在make命令调用期间构建。

我不确定是否有办法在外部项目上使用 find_package() 。如果是这样,请给我举一个例子。

谢谢巴努基兰

Ale*_*ing 13

您误解了ExternalProject应该如何工作。你不能 find_package(messages REQUIRED),因为它还没有建成。ExternalProject仅创建构建子项目所需的构建步骤。

您有两个选择:

  1. 使用add_subdirectoryFetchContent代替ExternalProject. 在这种情况下,您不需要打电话find_package。这有效地将子项目添加到主构建中并导入子项目的目标。
  2. 使用两个 ExternalProject调用:一个 for messages,另一个 for main_project,这取决于messages。如果messages使用该export(EXPORT)功能,您可以指向CMAKE_PREFIX_PATHmessages_ROOT到构建目录。否则,您需要运行安装步骤messages并在构建目录中设置安装前缀。然后find_project(messages REQUIRED)里面调用main_project就成功了。这可能需要重新构建您的构建。

一般来说,ExternalProject仅对定义超级构建有用,超级构建是相互依赖的 CMake 构建链。超级构建仅在您需要完全不同的配置时选项(例如不同的工具链)时才有用(例如,您正在交叉编译,但需要代码生成器在构建机器上运行)。如果不是这种情况,请更喜欢FetchContentadd_subdirectorygit 子模块。

最好FetchContent与 CMake 3.14+ 一起使用,因为它添加了FetchContent_MakeAvailable减少样板文件的宏。

文件:

https://cmake.org/cmake/help/latest/module/ExternalProject.html https://cmake.org/cmake/help/latest/module/FetchContent.html