带有嵌套依赖项的CMake 2.8.12,导致多个“包含”

时间:2018-07-16 17:37:42

标签: c++ cmake nested libraries

我有广泛分开的目录,每个目录都有一个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的回答是正确的。

0 个答案:

没有答案