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