如何在 CMake 项目中包含相同依赖项的两个不同版本?

Mik*_*lho 4 cmake dependency-management cmake-modules

我的系统中同时存在 1.2 和 2.2 版本的 ExternalProject。ExternalProject 是一个 CMake 项目,当我要求它们时,CMake 可以毫无问题地找到这两个版本。命令find_package(ExternalProject 1.2 EXACT)查找版本 1.2 并find_package(ExternalProject 2.2 EXACT)查找版本 2.2。

版本 1 和 2 彼此不兼容。API 完全不同。

我有一个 CMake 项目 MyProject,它有两个目标,targetOne 和 targetTwo。TargetOne 使用 ExternalProject 1.2,TargetTwo 使用 ExternalProject 2.2。

下面的代码没有做我想要的。相同的外部依赖项不会被查找两次。TargetTwo 的编译失败。CMake 是否以任何方式支持这种情况?(除非重命名 ExternalProject 版本 2 并在不同的位置编译它)。

project(MyProject)

find_package(ExternalProject 1.2 EXACT)
add_executable(targetOne target_one.c)
target_link_libraries(targetOne ExternalProject::externalProject)

find_package(ExternalProject 2.2 EXACT)
add_executable(targetTwo target_two.c)
target_link_libraries(targetTwo ExternalProject::externalProject)
Run Code Online (Sandbox Code Playgroud)

mr *_*NAE 5

You can't mix targets with the same names in the same CMakeLists.txt. Use different CMakeLists.txt - one for each executable target. Use add_subdirectory for this.

  • project ./CMakeLists.txt:
project(MyProject)
add_subdirectory(folder_one)
add_subdirectory(folder_two)
Run Code Online (Sandbox Code Playgroud)
  • ./folder_one/CMakeLists.txt:
find_package(ExternalProject 1.2 EXACT)
add_executable(targetOne target_one.c)
target_link_libraries(targetOne ExternalProject::externalProject)
Run Code Online (Sandbox Code Playgroud)
  • ./folder_two/CMakeLists.txt:
find_package(ExternalProject 2.2 EXACT)
add_executable(targetTwo target_two.c)
target_link_libraries(targetTwo ExternalProject::externalProject)
Run Code Online (Sandbox Code Playgroud)

此外,对于范围更改,您可以使用function

  • 这有效。但必须注意的是,CMakeCache.txt 仅包含一个“ExternalProject_DIR:PATH”,即最后找到的一个,即本例中的版本 2.2。如果使用 Find*.cmake 文件或通过 CMake 包缓存“~/.cmake/packages”找到项目,这可能没有实际意义。如果在命令行上指定了包位置,例如“-DExternalProject_ROOT=<dir>”,则此方法将不起作用。 (2认同)