如何强制Cmake执行多组件依赖的顶级CMakeLists.txt?

时间:2018-04-13 20:59:31

标签: android c android-studio makefile cmake

我试图用C支持我的android项目。让我们说我有以下结构(一切都是源目录,没有二进制文件):

CMakeLists.txt
src/main/cpp/|
             |---Executable1/
             |---Executable2/
             |---deps/

在这个CMakeLists.txt中我有:

cmake_minimum_required(VERSION 3.4.1)
project(ProjectName)
set(CMAKE_VERBOSE_MAKEFILE on)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/${ANDROID_ABI}")
add_subdirectory(src/main/cpp/deps)
add_subdirectory(src/main/cpp/Executable1)
add_subdirectory(src/main/cpp/Executable2)

In" deps"文件夹我有以下结构:

deps/|
     |---CMakeLists.txt
     |---Library1/
     |---LIbrary2/

在这个CMakeLists.txt中我有:

add_subdirectory(Library1)
add_subdirectory(Library2)

在Library2中,我有2个模块:

Library2/|---CMakeLists.txt
         |---Module1/
         |---Module2/

在这个CMakeLists.txt中我有

project(Library2)
include_directories ( BEFORE SYSTEM ${CMAKE_CURRENT_BINARY_DIR}/Module1
                                ${CMAKE_CURRENT_BINARY_DIR}/Module2
                                Module1
                                . )
add_subdirectory( Module1 )
add_subdirectory( Module2 )

Module1和Module2是我添加的库

add_library(Module1 STATIC sourceM1_1.c sourceM1_2.c ...)

add_library(Module2 STATIC sourceM2_1.c sourceM2_2.c ...)
分别在他们的CMakeLists.txt中

Executable2在其CMakeLists.txt:

add_executable(Executable2  sourceE2_1.c sourceE2_2.c ...)
target_link_libraries(Executable2 Module1 Module2)

如果以这种方式制作,我在编译Module1时会出错。

错误表示找不到某些标题。这些标题存在于" Library2"目录。

如果我在最顶层的CMakeLists.txt中注释掉了Executable2,那么一切都很好。

所以问题是如何强制CMake执行" Library2 / CMakeLists.txt"或者我需要做些什么来添加所需的包含目录?我想我可以将它们直接添加到" Module1"的CMakeLists.txt中。和"模块2"但我认为这不是一个好习惯。

1 个答案:

答案 0 :(得分:0)

好吧,过了一段时间我自己找到了解决方法。我无法让Cmake忽略Library2 CMakeLists.txt,所以我只是将缺少的include_directory引用到Library2到Module1和Module2 CMakeLists.txt。