在linux上使用_uandroid_API__;预定义进行android交叉编译会使我的程序失败
我在linux上为跨建筑android应用程序设置了conan,我在下面为这个跨建筑的conan创建了我的_配置文件,我运行了在linux上使用_uandroid_API__;预定义进行android交叉编译会使我的程序失败,android,c++,android-ndk,cross-compiling,Android,C++,Android Ndk,Cross Compiling,我在linux上为跨建筑android应用程序设置了conan,我在下面为这个跨建筑的conan创建了我的_配置文件,我运行了conan create。用户/测试-pr=我的个人资料 include(default) target_host=aarch64-linux-android android_ndk=$HOME/android-ndk-r21 api_level=21 [settings] arch=armv8 build_type=Release compiler=clang comp
conan create。用户/测试-pr=我的个人资料
include(default)
target_host=aarch64-linux-android
android_ndk=$HOME/android-ndk-r21
api_level=21
[settings]
arch=armv8
build_type=Release
compiler=clang
compiler.libcxx=libc++
compiler.version=9
os=Android
os.api_level=$api_level
[build_requires]
[options]
[env]
PATH=[$android_ndk/toolchains/llvm/prebuilt/linux-x86_64/bin]
CHOST=$target_host
AR=$target_host-ar
AS=$target_host-as
LD=$target_host-ld
STRIP=$target_host-strip
RANLIB=$target_host-ranlib
CC=$target_host$api_level-clang
CXX=$target_host$api_level-clang++
CONAN_MAKE_PROGRAM=$android_ndk/prebuilt/linux-x86_64/bin/make
CONAN_CMAKE_TOOLCHAIN_FILE=$android_ndk/build/cmake/android.toolchain.cmake
我制作了一个非常简单的文件:
#include <fcntl.h>
int raw_fallocate(int fd, off_t length) {
if (fallocate(fd, 0, 0, length) == 0) return 0;
return -1;
}
我不明白的是我找不到这个内置的东西…,我搜索了我的整个安卓ndk文件夹,找不到这个\define\uuuuu安卓API\uu16
另外,我只安装了android_ndk v21,我不知道这个版本的16是从哪里来的
有什么想法吗?这个#define"ANDROID"API"16
来自NDK本身(这是android-ndk-r21支持的最低API。要将其设置为21,必须将android_平台
参数传递给CMake。更新:这实际上是错误的。对于ABIarm64-v8a
来说,最小API是21。因此,问题是arch=armv8
无法工作
根据设置os.api_level=21应该是有效的。但是使用这种方法,您不应该提供CONAN_CMAKE_工具链文件
。更新:这不起作用,因为CONAN
与NDKr21不兼容
我假设,当您提供代码> CONNEA.CMACHOTICANION文件时,所有的设置,如<代码> cc= 和<代码> AR= 变得不相关。对于<代码>操作系统,AppialSeals和
。只需添加到-DANDROID\u PLATFORM=android-21
:
my\u profile
这种方法在包中使用。所以我已经对此进行了一些深入研究,我想我找到了问题所在。正如@Alex Cohn所说,android ndk将文件中的最小api级别设置为16
$android\u ndk/build/cmake/platforms.cmake
,它在第一行集合(ndk\u MIN\u PLATFORM\u LEVEL“16”)
。我将其更改为21后,一切正常
现在的问题是:我如何在不接触这个platforms.cmake
文件的情况下在外部覆盖这个值(我只是不想接触ndk包附带的文件)?我试图设置(ndk\u MIN\u PLATFORM\u LEVEL“16”)
在我的项目的CMakelists.txt
文件中,但这不起作用,因为我相信它稍后会被platforms.cmake
覆盖
当然,使用
conan
的ndk安装程序的第二种方法也有效,我检查了相同的平台。安装的ndk文件夹中的cmake
文件,它具有相同的16
。因此conan
设置中必须有某个地方将值更新为21
,我想知道在哪里/在使用ndk安装程序时,这是如何改变的,因此我可以对手动安装的android ndk执行相同的操作。\uuu android\u API\uuuu
指的是本机API级别,而不是ndk版本。您如何构建您的项目?@Michael我正在使用conan交叉构建它,问题中添加了conan配置文件谢谢您的回答,我已经完成了在我的配置文件中有os.api_level=21,当我删除CONAN_CMAKE_TOOLCHAIN_文件的行时,我得到了错误:Android:在NDK中找不到ABI'arm64-v8a'的工具链:因此我添加了集(Android_PLATFORM 21)
在我的CMakeLists.txt
中,我仍然收到警告-ANDROID\u平台未设置。默认为支持的最低版本16。
正如我所写,问题是自然的conan
方法与$ANDROID\u ndk/build/cmake/ANDROID.toolschain.cmake
不兼容。在cmake中,toolschain是在加载之前加载的文件当你把set(NDK\u MIN\u PLATFORM\u LEVEL“21”)放进去时
在CMakelists.txt中,为时已晚。conan-android\u ndk\u安装程序包将此设置作为命令行覆盖传递给CMake,并且优先。遗憾的是,conan
不支持ndk-r21。主分支可能卡在r16。
In file included from <built-in>:413:
<command line>:1:9: warning: '__ANDROID_API__' macro redefined [-Wmacro-redefined]
#define __ANDROID_API__ 21
^
<built-in>:405:9: note: previous definition is here
#define __ANDROID_API__ 16
^
1 warning generated.