我正在处理一个具有如下设置的项目:
Project
'-> CMakeLists.txt
'-> src
'-> ModuleA
'-> CMakeLists.txt
'-> main.cpp
'-> thirdparty
'-> CMakeLists.txt
'-> protobuf-3.11.3
'-> Foo
'-> CMakeLists.txt
'-> libs
'-> include
'-> 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 的依赖关系。是否有此解决方法的解决方案,例如将同一库的两个不同版本链接到主要目标?