链接到 CMake 中目标的同一库的两个版本

时间:2021-06-04 19:31:03

标签: cmake

我正在处理一个具有如下设置的项目:

Project
   '-> CMakeLists.txt
   '-> src
        '-> ModuleA
             '-> CMakeLists.txt
             '-> main.cpp
   '-> thirdparty
        '-> CMakeLists.txt
        '-> protobuf-3.11.3
        '-> Foo
              '-> CMakeLists.txt
              '-> libs
              '-> include
              '-> deps
  • 第三方的 protobuf-3.11.3 每次都编译成静态库,是 ModuleA 需要的。
  • 'Foo' 是另一个 3rd 方项目,它只构建了包含和静态库。
  • 'Foo' 还包含它需要存储在 Foo/deps 文件夹中的传递依赖

'Foo' 中的 CMakeLists.txt 如下所示:

 add_library(libfoo STATIC IMPORTED GLOBAL)
 cmake_path( SET FOO_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
 cmake_path( APPEND FOO_DIR "include" OUTPUT_VARIABLE FOO_INCLUDE_DIR )
 cmake_path( APPEND FOO_DIR "libs" OUTPUT_VARIABLE FOO_LIBRARY_DIR )
 cmake_path( APPEND FOO_DIR "deps" OUTPUT_VARIABLE FOO_DEPS_DIR )
 
 set_target_properties( libfoo PROPERTIES
                        IMPORTED_LOCATION "${FOO_LIBRARY_DIR}/libfoo.a"
                        INTERFACE_INCLUDE_DIRECTORIES "${FOO_INCLUDE_DIR}"
                        INTERFACE_LINK_LIBRARIES "${FOO_DEPS_DIR}/libprotobuf.a")

libfoo 的 libprotobuf.a 依赖项是使用 protobuf-3.13.0 构建的

ModuleA 的 CMakeLists.txt 如下所示:

 add_executable(moduleA main.cpp)
 target_link_libraries(moduleA PRIVATE
                       libfoo
                       libprotobuf)

问题

我遇到的问题是这不会编译,因为 ModuleA 直接依赖于使用 protobuf-3.11.3 构建的 libprotobuf.a,而 libfoo 依赖于 protobuf-3.13.0。这会导致 google::protobuf::<...> 出现很多多重定义错误 我无法控制 Foo 包对 3.13.0 的依赖关系或 ModuleA 对 3.11.3 的依赖关系。是否有此解决方法的解决方案,例如将同一库的两个不同版本链接到主要目标?

0 个答案:

没有答案
相关问题