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

标签 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)

最佳答案

您不能在同一个 CMakeLists.txt 中混合具有相同名称的目标.使用不同的 CMakeLists.txt - 每人一份 executable目标。使用 add_subdirectory 为了这。

  • 项目 ./CMakeLists.txt:
  • project(MyProject)
    add_subdirectory(folder_one)
    add_subdirectory(folder_two)
    
  • ./folder_one/CMakeLists.txt:
  • find_package(ExternalProject 1.2 EXACT)
    add_executable(targetOne target_one.c)
    target_link_libraries(targetOne ExternalProject::externalProject)
    
  • ./folder_two/CMakeLists.txt:
  • find_package(ExternalProject 2.2 EXACT)
    add_executable(targetTwo target_two.c)
    target_link_libraries(targetTwo ExternalProject::externalProject)
    

    另外,对于 scope changing您可以使用 function

    关于cmake - 如何在 CMake 项目中包含相同依赖项的两个不同版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58316523/

    相关文章:

    c++ - CMake Visual Studio 将可执行文件与静态库链接

    azure - 使用 CMake 实用程序构建 Azure IoT 网关 SDK 解决方案

    visual-studio - CMake 到 Qt Creator .pro 文件;从 Qt Creator 构建特定的 CMake 项目

    maven - Maven 依赖项中类型 "bundle"的含义是什么?

    plugins - 如何覆盖 sbt 插件的依赖?

    c++ - 带有 QT5 "Qt5::QtCore"的现代 CMake 3 但未找到目标

    c++ - 构建一个可移植的可执行文件及其依赖项

    java - 如何在 Gradle 中隐藏传递依赖?

    c++ - 如何使用 CMake 在 macOS 上使用和链接 boost?

    c++ - 使外部项目可用于find_package CMake