我有广泛分开的目录,每个目录都有一个CMakeLists.txt。我想让它们独立构建。两个是库; libA,libB。 libB使用libA。 exeC使用libA和libB。
当我通过add_subdirectory()组织它们时,如下所示: libB(CMakeLists.txt):
add_subdirectory($DIRA somebuild)
target_linked_libraries(libB PUBLIC libA)
exeC(CMakeLists.txt):
add_subdirectory($DIRA somebuild)
add_subdirectory($DIRB somebuild)
target_linked_libraries(exeC PUBLIC libB libA)
然后构建exeC,CMake抱怨libA的目标名称不是唯一的(CMP0002)。如果我抑制了该警告,则在文档警告时会得到时髦的结果。
当我通过以下方式组织它们时:add_library()和add_dependencies()如下所示: libB(CMakeLists.txt):
add_library(libA SHARED IMPORTED)
set_target_properties(libA PROPERTIES IMPORTED_LOCATION $DIRA)
add_dependencies(libB libA)
target_linked_libraries(libB PUBLIC libA)
exeC(CMakeLists.txt):
add_library(libA SHARED IMPORTED)
set_target_properties(libA PROPERTIES IMPORTED_LOCATION $DIRA)
add_dependencies(exeC libA)
add_library(libB SHARED IMPORTED)
set_target_properties(libB PROPERTIES IMPORTED_LOCATION $DIRB)
add_dependencies(exeC libB)
target_linked_library(exeC PUBLIC libA libB)
似乎依赖项没有传播-当我构建exeC时,它确实阻塞了在那儿找不到libA和libB的位置,正如文档所警告的那样,尽管我认为我还看到了其他一些文档,说如果所需的库全部基于CMake。我正在使用CMake 2.8.12。
是否可能有这样的嵌套包含物,或者这不是CMake方式?
edit:进一步证明,仅依赖于add_subdirectory()的传递性的一种解决方案是不够的,因为我的情况实际上是菱形的,我有libB1和libB2,它们各自“包括” libA并包含在内通过exeC。看起来包括守卫可能是要走的路。如果我能解决这个问题,我会承认@Drop的回答是正确的。