Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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/1/hibernate/5.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
在linux上使用_uandroid_API__;预定义进行android交叉编译会使我的程序失败_Android_C++_Android Ndk_Cross Compiling - Fatal编程技术网

在linux上使用_uandroid_API__;预定义进行android交叉编译会使我的程序失败

在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

我在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
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。更新:这实际上是错误的。对于ABI
arm64-v8a
来说,最小API是21。因此,问题是
arch=armv8
无法工作

根据设置os.api_level=21应该是有效的。但是使用这种方法,您不应该提供
CONAN_CMAKE_工具链文件
。更新:这不起作用,因为
CONAN
与NDKr21不兼容

我假设,当您提供代码> CONNEA.CMACHOTICANION文件时,所有的设置,如<代码> cc= 和<代码> AR= 变得不相关。对于<代码>操作系统,AppialSeals和ARC> <代码>。但是如果您用原始代码<代码> CMAS/<代码>二进制来替换<代码> CMAS/<代码>,并设置必要的命令行PAR。您应该设置参数,包括

-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.