【发布时间】:2014-10-07 04:29:13
【问题描述】:
我有以下目录结构
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.so 和libB.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.cmake 和B/b.cmake 并声明A_INCLUDE_DIRS 和B_INCLUDE_DIRS。但是 A 又不是 B 的子目录
如果我在那里制作B/a.cmake、app/a.cmake 和app/b.cmake 文件和SET 变量INCLUDE_DIRS 并将它们包含在他们的CMakeLists.txt 中?但这是解决这个问题的标准方法吗?或者这甚至会起作用吗?
问题 2
另一件事我尝试将main.cpp 和CMakeLists.txt 放在root 上(例如应用程序的父级,a,b)。在那里我可以很容易地ADD_SUBDIRECTORY(A),因为它确实是一个子目录。我做了
SET(A_INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/includes
)
在A/CMakeLists.txt。并希望在 root/CMakeLists.txt 中获得该变量,但它不起作用。但是如果我将PARENT_SCOPE 或SCOPE 与SET 一起使用,它就可以工作,但我不知道这样配置是否可以,或者它是一种黑客行为?
【问题讨论】:
标签: c++ cmake dependencies