Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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三次才能获得所需的输出_Android_C++_Cmake_Cross Compiling_Clion - Fatal编程技术网

Android 自定义命令需要调用CMake三次才能获得所需的输出

Android 自定义命令需要调用CMake三次才能获得所需的输出,android,c++,cmake,cross-compiling,clion,Android,C++,Cmake,Cross Compiling,Clion,我的项目相当简单。我有一个应用程序,其中包含一个基于integration platfrom编写的库,因此它看起来像这样: My app ----> Extension ----> Main library 该应用程序被交叉编译为Android。所有这些都基于CMake。我正在使用CLion作为IDE。我已经添加了一个配置文件,其中包含为Android构建所需的自定义工具链(即clang、clang++用于apropiate平台、来自Android SDK的

我的项目相当简单。我有一个应用程序,其中包含一个基于integration platfrom编写的库,因此它看起来像这样:

My app

  ----> Extension

        ----> Main library
该应用程序被交叉编译为Android。所有这些都基于CMake。我正在使用CLion作为IDE。我已经添加了一个配置文件,其中包含为Android构建所需的自定义工具链(即clang、clang++用于apropiate平台、来自Android SDK的cmake和来自Android NDK r20b的make)。问题是我必须调用CMake 3次(在CLion中重新加载),然后它才能生成所需的所有文件。下面列出了整个文件

在第一次运行时,它忽略了一个事实,即它是为android构建的(不进入if(android)),并复制linux的预构建子可执行文件(默认)

在第二次运行时,它忽略了所需的android.toolchain.cmake,在此阶段构建时,它无法将android头添加到搜索路径,但选择了正确的预构建子可执行文件

在第三次运行时,它使用android.toolchain.cmake文件并选择正确的子可执行文件

在那之后,我可以点击build,一切都可以正确编译

我拥有的CMake:

add_executable(androidApp main.cpp)

target_include_directories(androidApp
        PUBLIC
        ../submodules/exten/src/libraries/main_lib/lib/include
        ../submodules/exten/src/libraries/main_lib/sdk/rlogging/include) //Headers from main library

target_link_libraries(androidApp
        PRIVATE
        exten) //Extension

install(TARGETS androidApp DESTINATION ${CMAKE_SOURCE_DIR}/bin)
install(FILES ../submodules/exten/src/libraries/main_lib/integration_app/resources/someFile.zip DESTINATION ${CMAKE_SOURCE_DIR}/bin)
install(FILES ../resources/someFile2.zip DESTINATION ${CMAKE_SOURCE_DIR}/bin/resources)

file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/bootsafe)
file(WRITE ${CMAKE_SOURCE_DIR}/bin/bootsafe/dummy "") //Required dir

add_custom_command(TARGET dongleApp POST_BUILD
        COMMAND ${CMAKE_SOURCE_DIR}/ndk/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/arm-linux-androideabi/bin/strip --strip-debug dongleApp
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        COMMENT "Stripping debug symbols")

if (ANDROID)
    target_link_libraries(androidApp
            PRIVATE
            log)
endif (ANDROID) //Linking android lib

在不同的CMake(在主库级别)上,下面是如何选择正确的预构建

if(NOT ANDROID)
    set(PREBUILD_NAME "linux")
else()
    if(ANDROID_ABI STREQUAL "x86_64")
        set(PREBUILD_NAME "android-x86")
    else()
        set(PREBUILD_NAME "android-arm")
    endif()
endif()
用于生成生成生成文件的命令:

/home/gravlok/companyName/app_v2/sdk/cmake/3.10.2.4988404/bin/cmake 
-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_MAKE_PROGRAM=/home/gravlok/companyName/app_v2/ndk/android-ndk-r20b/prebuilt/linux-x86_64/bin/make
-DCMAKE_C_COMPILER=/home/gravlok/companyName/app_v2/ndk/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi28-clang
-DCMAKE_CXX_COMPILER=/home/gravlok/companyName/app_v2/ndk/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi28-clang++
-DANDROID=ON
-DCMAKE_TOOLCHAIN_FILE=/home/gravlok/companyName/app_v2/ndk/android-ndk-r20b/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28
-G "CodeBlocks - Unix Makefiles"
/home/gravlok/companyName/app_v2
为什么我需要运行它3次才能正确配置