Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何强制Cmake执行多组件依赖项的顶级CMakeLists.txt?_Android_C_Android Studio_Makefile_Cmake - Fatal编程技术网

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

Android 如何强制Cmake执行多组件依赖项的顶级CMakeLists.txt?,android,c,android-studio,makefile,cmake,Android,C,Android Studio,Makefile,Cmake,我正在尝试用C语言支持我的android项目。假设我有以下结构(所有内容都是源目录,没有二进制文件): 在这个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}

我正在尝试用C语言支持我的android项目。假设我有以下结构(所有内容都是源目录,没有二进制文件):

在这个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)
add_subdirectory(Library1)
add_subdirectory(Library2)
在“deps”文件夹中,我具有以下结构:

deps/|
     |---CMakeLists.txt
     |---Library1/
     |---LIbrary2/
在这个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)
add_subdirectory(Library1)
add_subdirectory(Library2)
在Library2中,我有两个模块:

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 )
模块1和模块2是我添加的库

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)

如果以这种方式进行操作,则在编译模块1时会出现错误

错误表明未找到某些标题。这些标题位于“Library2”目录中

如果我在最上面的CMakeLists.txt中注释掉Executable2,那么一切都可以正常编译


所以问题是如何强制CMake执行“Library2/CMakeLists.txt”中的指令,或者我必须做什么才能添加所需的include目录?我想我可以直接将它们添加到“Module1”和“Module2”的CMakeLists.txt中,但我认为这不是一个好的做法。

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

“编译Module1时我会出错。”。。。“如果我在最上面的CMakeLists.txt中注释掉可执行文件2,那么一切都可以正常编译。”-因此,在编译可执行文件
Executable2
时会出现错误,而不是在编译模块
Module1
时,不是吗?不。实践表明,如果我有一些依赖于某些库的可执行文件,cmake自上而下遍历CMakeLists.txt的层次结构,只提取与可执行文件的依赖项相对应的目标,构建它们,构建可执行文件,并将可执行文件链接到库。如果LIB是静态的,那么就是这样。如果它们是共享的,它们也包括在APK中,但过程看起来是一样的。如果我有一些库目标,并且没有任何依赖于它们,那么它们是根据CMakeLists层次结构单独构建的,如果它们是共享的,则包含在APK中。我不是Android方面的专家,但从CMake的角度来看,这些东西与您描述的不同。请用确切的错误消息更新您的问题,其中包括生成的目标文件的名称。实际上,我自己已经找到了解决方法,无法重现完全相同的错误。我只能说Library2是OpenSSL,使用的是来自的CMake构建系统,问题是在构建加密库时,它说在第64行的标题e_os.h中,它不能引用in build.gradle,您可以指定覆盖自然CMake首选项来构建可执行文件。这意味着,在Module1/CMakeLists.txt中,您现在说
包含目录(在系统${CMAKE\u CURRENT\u BINARY\u DIR之前)
和Module2相同?这意味着我在系统${PROJECT\u SOURCE\u DIR}之前添加了
/src/main/cpp/Library2)
包含目录
。正如我在问题的最后一条评论中所说的,我对OpenSSL及其加密和LibSSL模块有一个问题。在这一步之后,我还遇到了一些其他问题,但这些问题是通过类似方式解决的。实际上,更好的做法是使用
目标包含目录(Module1 PUBLIC${CMAKE\u CURRENT\u BINARY\u DIR)/…)
等,而不是不加选择的
包括目录