clang 3.5中的Windows宏,ndk r10e,CMake

时间:2016-05-06 09:57:13

标签: c++ android-ndk macros cmake clang++

我正在为Android构建一个基于CMake的项目,使用NDK r10e,x86_64,工具链名称为arm-linux-androideabi-clang3.5

目前我收到了非常奇怪的错误,建议使用某些Windows预处理器宏,例如_WIN32_WIN64__MINGW32__

我的项目使用部分stlplus3,版本3-03-11,特别是filesystem

我使用来自https://github.com/taka-no-me/android-cmake的CMake Android工具链(此工具链用于OpenCV)

这是CMake电话

set ANDROID_SDK=C:\Android\sdk
set ANDROID_NDK=c:\Android\android-ndk-r10e
set ANDROID_EXECUTABLE=%ANDROID_SDK%\tools\android.bat 
set CMAKE_PATH=C:\Program Files (x86)\CMake\bin
set PATH=%PATH%;%CMAKE_PATH%

cmake .. -DCMAKE_TOOLCHAIN_FILE="%~dp0\..\cmake\android.toolchain.cmake" -DCMAKE_BUILD_TYPE=Release -DANDROID_NDK=%ANDROID_NDK%^
     -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-clang3.5 -DANDROID_EXTRA_NDK_VERSIONS="-r10e"^
     -DANDROID_ABI="armeabi-v7a with NEON"^
     -G"Ninja" 

这是编译器输出:

[29/186] Building CXX object modules/3rdparty/stlplus3/CMakeFiles/stlplus3.dir/portability_fixes.cpp.o 
FAILED: C:\Android\android-ndk-r10e\toolchains\llvm-3.5\prebuilt\windows-x86_64\bin\clang++.exe   -DANDROID -D_CRT_SECURE_NO_WARNINGS -D__STDC_LIMIT_MACROS 
-isystem C:/Android/android-ndk-r10e/platforms/android-8/arch-arm/usr/include -isystem C:/Android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include -isystem C:/Android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -isystem C:/Android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include/backward 
-IC:/opencv/android-clang/sdk/native/jni/include/opencv -IC:/opencv/android-clang/sdk/native/jni/include -I../modules/common 
-fPIC -fPIE -flax-vector-conversions -Ofast -MMD -MT 
modules/3rdparty/stlplus3/CMakeFiles/stlplus3.dir/portability_fixes.cpp.o -MF 
modules/3rdparty/stlplus3/CMakeFiles/stlplus3.dir/portability_fixes.cpp.o.d -o modules/3rdparty/stlplus3/CMakeFiles/stlplus3.dir/portability_fixes.cpp.o 
-c ../modules/3rdparty/stlplus3/portability_fixes.cpp 
../modules/3rdparty/stlplus3/portability_fixes.cpp:12:10: fatal error: 'windows.h' file not found 
#include "windows.h"

以下是portability_fixes.hpp

的相应代码
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
#define MSWINDOWS
#endif

以下是portability_fixes.cpp

的相应代码
#include "portability_fixes.hpp"

#ifdef MSWINDOWS
#include "windows.h"
#endif

我还尝试添加如下代码

#if defined(_WIN32) && defined(ANDROID)
#error win32
#endif

#if defined(_WIN64) && defined(ANDROID)
#error win64
#endif

#if defined(_WIN32_WCE) && defined(ANDROID)
#error win32_wce
#endif

并且有两条错误消息," win32"和" win64"。

我还试图解决这些宏,添加... && !defined(ANDROID)。但是我在文件__mingw_aligned_malloc

中有关于未定义的符号mm_malloc.h的错误

研究其代码,我发现了以下内容:

static __inline__ void *__attribute__((__always_inline__, __nodebug__,
                                   __malloc__))
_mm_malloc(size_t __size, size_t __align)
    ....
  void *__mallocedMemory;
#if defined(__MINGW32__)
  __mallocedMemory = __mingw_aligned_malloc(__size, __align);
#elif defined(_WIN32)
  __mallocedMemory = _aligned_malloc(__size, __align);
#elif defined(__ANDROID__)
  __mallocedMemory = memalign(__align, __size);
#else
    ....

所以,看起来我做错了什么,但不明白是什么。

由于与其他项目的兼容性问题,切换编译器不是一种选择。

那么如何让编译器取消定义这些宏?

此外,OpenCV可以使用相同的选项进行构建。

更新:我已经下载了ND86 r10e的x86版本,它编译了我的代码。

1 个答案:

答案 0 :(得分:0)

看起来像64位版本的NDK r10e中的错误。

我已经下载了ND86 r10e的x86版本,它编译了我的代码。