Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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 studio Android Studio链接不同ABI的共享库时出现问题 我的文凭项目,我尝试使用Android Studio将我的C++项目移植到Android。我的C++项目包括我自己开发的代码和库。 首先,我试图将这个库的源代码编译成一个共享的android库。我成功地做到了。但当我编译使用该库的代码时,cmake告诉我,我的库与x86体系结构不兼容,我认为其他体系结构也不兼容。 在编译库时,我将此代码用于不同的ABI,包括: if (${ANDROID_ABI} STREQUAL "armeabi-v7a") include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) elseif (${ANDROID_ABI} STREQUAL "x86_64") include_directories(${ANDROID_SYSROOT}/usr/include/x86_64-linux-android) elseif (${ANDROID_ABI} STREQUAL "x86") include_directories(${ANDROID_SYSROOT}/usr/include/i686-linux-android) elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) endif()_Android Studio_Cmake_Android Ndk_Abi - Fatal编程技术网

Android studio Android Studio链接不同ABI的共享库时出现问题 我的文凭项目,我尝试使用Android Studio将我的C++项目移植到Android。我的C++项目包括我自己开发的代码和库。 首先,我试图将这个库的源代码编译成一个共享的android库。我成功地做到了。但当我编译使用该库的代码时,cmake告诉我,我的库与x86体系结构不兼容,我认为其他体系结构也不兼容。 在编译库时,我将此代码用于不同的ABI,包括: if (${ANDROID_ABI} STREQUAL "armeabi-v7a") include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) elseif (${ANDROID_ABI} STREQUAL "x86_64") include_directories(${ANDROID_SYSROOT}/usr/include/x86_64-linux-android) elseif (${ANDROID_ABI} STREQUAL "x86") include_directories(${ANDROID_SYSROOT}/usr/include/i686-linux-android) elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) endif()

Android studio Android Studio链接不同ABI的共享库时出现问题 我的文凭项目,我尝试使用Android Studio将我的C++项目移植到Android。我的C++项目包括我自己开发的代码和库。 首先,我试图将这个库的源代码编译成一个共享的android库。我成功地做到了。但当我编译使用该库的代码时,cmake告诉我,我的库与x86体系结构不兼容,我认为其他体系结构也不兼容。 在编译库时,我将此代码用于不同的ABI,包括: if (${ANDROID_ABI} STREQUAL "armeabi-v7a") include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) elseif (${ANDROID_ABI} STREQUAL "x86_64") include_directories(${ANDROID_SYSROOT}/usr/include/x86_64-linux-android) elseif (${ANDROID_ABI} STREQUAL "x86") include_directories(${ANDROID_SYSROOT}/usr/include/i686-linux-android) elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) endif(),android-studio,cmake,android-ndk,abi,Android Studio,Cmake,Android Ndk,Abi,我不知道如何解决这个问题。看起来我需要链接任何依赖ABI的库,但我不知道如何理解我需要哪个库。我的库有很多文件,很难只跟踪所有依赖项。那么,在构建我的库之后,我该如何解决这个问题呢?所以对于所有的ABI,我使用${ANDROID_ABI}将它们链接到主代码 我的Android Studio项目中有两个模块:库和应用程序。库构建得很好,但我无法将其链接到应用程序,因为cmake告诉我库是一个不兼容的目标。在更改了cmakes之后,我去掉了ABI cmake块,但是库仍然不想链接 应用程序cmake

我不知道如何解决这个问题。看起来我需要链接任何依赖ABI的库,但我不知道如何理解我需要哪个库。我的库有很多文件,很难只跟踪所有依赖项。那么,在构建我的库之后,我该如何解决这个问题呢?所以对于所有的ABI,我使用${ANDROID_ABI}将它们链接到主代码

我的Android Studio项目中有两个模块:库和应用程序。库构建得很好,但我无法将其链接到应用程序,因为cmake告诉我库是一个不兼容的目标。在更改了cmakes之后,我去掉了ABI cmake块,但是库仍然不想链接

应用程序cmake:

lib-main-cmake:

lib其他cmake:


您不需要手动添加CMake块,它也远未完成。按照文档中的说明使用CMake和NDK,它将为您处理详细信息:

我终于做到了!在我重写了cmakes文件之后,我几乎做出了正确的决定。我想念阿比。我已对我的cmakes进行了一些更正:

应用程序cmake:

lib other cmake我删除MSVC块只是因为它对android构建毫无用处:

macro(acheron_set_build_directory build_dir)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${build_dir}/${ANDROID_ABI})
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${build_dir}/${ANDROID_ABI})
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${build_dir}/${ANDROID_ABI})
endmacro()

如果没有这个块,我的库甚至无法编译。我有一个类似的问题:自从我开始使用Androod Studio以来,我一直在关注它。但无论如何,我解决了我的问题。没有“通用”这样的东西,所以图书馆。使用Android Studio构建库的所有相关ABI变体。它将包括为您处理ABI和平台技巧的CMake工具链文件,并确保在编译使用此库的代码时链接正确的变体。
cmake_minimum_required(VERSION 3.3)

set(ACHERON_GLOBAL_ROOT ${CMAKE_CURRENT_LIST_DIR})
set(ACHERON_GLOBAL_BUILD_DIRECTORY "${ACHERON_GLOBAL_ROOT}/build")

function(acheron_add_subprojects proj_dir_list)
    foreach(proj_dir ${proj_dir_list})
        add_subdirectory(${proj_dir})
    endforeach()
endfunction()

acheron_add_subprojects("${ACHERON_GLOBAL_ROOT}/src/main/acheron")
cmake_minimum_required(VERSION 3.3)

project(acheron)

set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR})

macro(acheron_set_build_directory build_dir)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${build_dir})
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${build_dir})
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${build_dir})
    if(MSVC)
        set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${build_dir})
        set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${build_dir})
        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${build_dir})
        set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${build_dir})
        set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${build_dir})
        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${build_dir})
    endif(MSVC)
endmacro()

acheron_set_build_directory(${ACHERON_GLOBAL_BUILD_DIRECTORY}/${CMAKE_BUILD_TYPE}/${PROJECT_NAME})

function(acheron_get_files_from_list out_file_list in_list)
    set(file_list "")
    foreach(in_item ${in_list})
        if(NOT IS_DIRECTORY ${in_item})
            list(APPEND file_list ${in_item})
        endif()
    endforeach()
    set(${out_file_list} ${file_list} PARENT_SCOPE)
endfunction()
function(acheron_get_all_files_recursively out_file_list folder)
    file(GLOB_RECURSE all_list ${folder}/*)
    acheron_get_files_from_list(file_list "${all_list}")
    set(${out_file_list} ${file_list} PARENT_SCOPE)
endfunction()

acheron_get_all_files_recursively(acheron_files ${CMAKE_CURRENT_SOURCE_DIR})

function(acheron_get_src_regex_pattern out_pattern)
    set(${out_pattern} ".*\\.(((C|c)(P|p)(P|p)))$" PARENT_SCOPE)
endfunction()

acheron_get_src_regex_pattern(src_pattern)

function(acheron_get_filtered out_list regex_pattern in_list)
    set(temp_list "")
    foreach(in_item ${in_list})
        if(${in_item} MATCHES ${regex_pattern})
            list(APPEND temp_list ${in_item})
        endif()
    endforeach()
    set(${out_list} ${temp_list} PARENT_SCOPE)
endfunction()

acheron_get_filtered(acheron_files ${src_pattern} "${acheron_files}")

function(acheron_add_source_groups root_dir src_list)
    foreach(src_file ${src_list})
        get_filename_component(src_name ${src_file} NAME)
        string(REPLACE ${root_dir}/ "" group_name ${src_file})
        string(REPLACE /${src_name} "" group_name ${group_name})
        string(REPLACE "/" "\\" group_name ${group_name})
        if(NOT ${group_name} STREQUAL ${src_name})
            source_group(${group_name} FILES ${src_file})
        endif()
    endforeach()
endfunction()

acheron_add_source_groups(${CMAKE_CURRENT_SOURCE_DIR} "${acheron_files}")


add_library(${PROJECT_NAME} SHARED "${acheron_files}")
set(lib_src_DIR ${CMAKE_CURRENT_LIST_DIR}/../acheron_lib/build/${CMAKE_BUILD_TYPE}/acheron)

set_target_properties(libacheron
                      PROPERTIES IMPORTED_LOCATION
                      ${lib_src_DIR}/${ANDROID_ABI}/libacheron.so)
macro(acheron_set_build_directory build_dir)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${build_dir}/${ANDROID_ABI})
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${build_dir}/${ANDROID_ABI})
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${build_dir}/${ANDROID_ABI})
endmacro()