我有以下目录结构
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
我尝试在root上放置main.cpp
和CMakeLists.txt
的另一件事(例如app的父,a,b)。在那里,我可以轻松地ADD_SUBDIRECTORY(A)
作为它真正的子目录。我做了
SET(A_INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/includes
)
<{1>} A/CMakeLists.txt
。并期望在root / CMakeLists.txt中获取该变量,但这不起作用。但是如果我将PARENT_SCOPE
或SCOPE
与SET
一起使用,它就有效但我不知道配置这样的方式还是黑客攻击是否可行?
答案 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)