Windows clang 3.5、ndk r10e、CMake 中的宏
Windows macros in clang 3.5, ndk r10e, CMake
我正在为 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)
。但是后来我在文件 mm_malloc.h
中遇到了一个关于未定义符号 __mingw_aligned_malloc
的类似错误
研究它的代码,我发现了以下内容:
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 使用相同的选项构建良好。
更新:我已经下载了 NDK r10e 的 x86 版本并且它编译了我的代码。
看起来像是 NDK r10e 的 64 位版本中的错误。
我已经下载了 x86 版本的 NDK r10e,它可以很好地编译我的代码。
我正在为 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)
。但是后来我在文件 mm_malloc.h
__mingw_aligned_malloc
的类似错误
研究它的代码,我发现了以下内容:
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 使用相同的选项构建良好。
更新:我已经下载了 NDK r10e 的 x86 版本并且它编译了我的代码。
看起来像是 NDK r10e 的 64 位版本中的错误。
我已经下载了 x86 版本的 NDK r10e,它可以很好地编译我的代码。