CMake imported targets链接订单与钻石依赖关系不是我们所期望的

CMake imported targets链接订单与钻石依赖关系不是我们所期望的,cmake,Cmake,我将Conan用于外部依赖项,因此充分利用CMake中的导入目标。如此之多,以至于我偶然发现了一个我似乎无法解决的问题 我试图实现的一个简单示例如下所示: cmake_minimum_required(VERSION 3.2 FATAL_ERROR) project(test_proje

我将Conan用于外部依赖项,因此充分利用CMake中的导入目标。如此之多,以至于我偶然发现了一个我似乎无法解决的问题

我试图实现的一个简单示例如下所示:

cmake_minimum_required(VERSION 3.2 FATAL_ERROR)                                                                                                          
project(test_project VERSION 0.1.0 LANGUAGES C CXX)                                                                                                      

add_library(IMPORTED::a INTERFACE IMPORTED)                                                                                                              
add_library(IMPORTED::b INTERFACE IMPORTED)                                                                                                              
add_library(IMPORTED::c INTERFACE IMPORTED)                                                                                                              

set_property(TARGET IMPORTED::a PROPERTY INTERFACE_LINK_LIBRARIES a IMPORTED::c)                                                                         
set_property(TARGET IMPORTED::b PROPERTY INTERFACE_LINK_LIBRARIES b IMPORTED::c)                                                                         
set_property(TARGET IMPORTED::c PROPERTY INTERFACE_LINK_LIBRARIES c)                                                                                     

add_executable(test_link main.cpp)                                                                                                                       
target_link_libraries(test_link IMPORTED::a)                                                                                                             
target_link_libraries(test_link IMPORTED::b)
在这种情况下,库a和库b都依赖于库c。因此,test_link的链接顺序应该类似于-la-lb-lc。相反,VERBOSE=1 make向我们表明这并没有发生:

[ 50%] Linking CXX executable test_link
/usr/bin/cmake -E cmake_link_script CMakeFiles/test_link.dir/link.txt --verbose=1
/usr/bin/ccache  g++    -rdynamic CMakeFiles/test_link.dir/main.cpp.o  -o test_link -la -lc -lb
c作为a的依赖项被正确地拉入,但b随后被链接入,并且G++不会解析c中b的符号

在实际项目中,A和B是Protobuf和OpenCV,C是Zlib。当像CMake现在这样链接时,编译器只是抱怨OpenCV缺少一些应该在zlib中找到的符号


我做错什么了吗?这是CMake中的错误吗?最后,我如何解决这个问题?

G++不会解析c中b的符号。
-要解决这个问题,您需要告诉CMake“c”依赖于“b”。当前的
CMakeLists.txt
中没有这种依赖关系。