CMake导入的目标链接顺序与钻石依赖性不是我们所期望的

时间:2017-10-10 09:19:38

标签: cmake

我正在使用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中的错误吗?最后,我该如何解决这个问题?

0 个答案:

没有答案