CMake库相邻的子目录依赖

时间:2014-08-13 17:26:53

标签: c++ cmake dependencies

我有以下目录结构

A                                  # produces libA
  CMakeLists.txt
  includes
    file.h
  sources
    file.cpp
B                                  # produces libB depends on libA
  CMakeLists.txt
  includes
     ...
  sources
     ...
app                                # produces executable, depends on libA and libB
  CMakeLists.txt
  includes
    ...
  sources
    ...

我希望libA.solibB.so可以独立使用,也可以由其他应用程序以及app使用。

使用CMake管理此问题的简洁方法是什么。

A/CMakeLists.txt

中的

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/includes)
...
ADD_LIBRARY(a SHARED ${A_SOURCES})
B/CMakeLists.txt

中的

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/includes)
ADD_sUBDIRECTORY(../A)
# ^^^ This wont work
...
ADD_LIBRARY(b SHARED ${B_SOURCES})

app/CMakeLists.txt中会出现同样的问题你不能ADD_SUBDIRECTORY一个兄弟姐妹

我不想使用显式目录名称对路径进行硬编码。我想我并不孤单,更多人也面临同样的问题。那么常规解决方案是什么呢?

我应该放置A/a.cmakeB/b.cmake并声明A_INCLUDE_DIRSB_INCLUDE_DIRS。但是A又不是B

的子目录

如果我在那里制作B/a.cmakeapp/a.cmakeapp/b.cmake个文件以及SET变量INCLUDE_DIRS并将它们包含在CMakeLists.txt中?但这是解决这个问题的标准方法吗?或者这甚至会起作用吗?

问题2

我尝试在root上放置main.cppCMakeLists.txt的另一件事(例如app的父,a,b)。在那里,我可以轻松地ADD_SUBDIRECTORY(A)作为它真正的子目录。我做了

SET(A_INCLUDE_DIRS
  ${CMAKE_CURRENT_SOURCE_DIR}/includes
)
<{1>} A/CMakeLists.txt。并期望在root / CMakeLists.txt中获取该变量,但这不起作用。但是如果我将PARENT_SCOPESCOPESET一起使用,它就有效但我不知道配置这样的方式还是黑客攻击是否可行?

1 个答案:

答案 0 :(得分:0)

您需要顶级CMakeLists.txt

add_subdirectory(A)
add_subdirectory(B)
add_subdirectory(app)

app/CMakeLists.txt内部:

add_executable(app ...)
target_link_libraries(app A B)