【问题标题】:Android cross compile command line on windows cmake using wrong compiler?Android 使用错误的编译器在 Windows cmake 上交叉编译命令行?
【发布时间】:2021-03-11 22:22:39
【问题描述】:

我不知道为什么这给我带来了这么多麻烦。我正在尝试从在 linux 上编译这个 .so 库转向在 Windows 机器上编译它。出于某种原因,每当我运行 cmake .. cmake 总是关闭并使用 MSVC 而不是我告诉它在我的 cmake 文件中使用的编译器。也许我已经盯着它太久了,但我不明白我有什么问题。我什至尝试在 Android sdk 中使用 cmake,同样的问题。我错过了什么?

我的 cmake 文件:

cmake_minimum_required(VERSION 3.10.2)
project(TEST)


set(CMAKE_TOOLCHAIN_FILE "C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake")
set(ANDROID_ABI arm64-v8a)

set(TOOLCHAIN "C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64")


set(CC ${TOOLCHAIN}/bin/aarch64-linux-android28-clang)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN}/bin/aarch64-linux-android28-clang++)

set(CMAKE_C_COMPILER ${TOOLCHAIN}/bin/aarch64-linux-android28-clang)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN}/bin/aarch64-linux-android28-clang++)

include_directories(${CMAKE_SOURCE_DIR}/headers )


add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             #main.cpp
             Image_Reader.cpp
             CV_Main.cpp
             Native_Camera.cpp
             unityInterface.cpp
        )


#tensorflow lite
add_library(lib_tflite SHARED IMPORTED)
set_target_properties(lib_tflite
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/arm64-v8a/libtensorflowlite.so)

#OpenCV
add_library(lib_opencv SHARED IMPORTED)
set_target_properties(lib_opencv
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/arm64-v8a/libopencv_java4.so)






find_library( log-lib log C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/platforms/android-28/arch-arm/usr/lib NO_DEFUALT_PATH)
find_library( camera-lib camera2ndk C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/platforms/android-28/arch-arm/usr/lib NO_DEFUALT_PATH)
find_library( media-lib mediandk C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/platforms/android-28/arch-arm/usr/lib NO_DEFUALT_PATH)
find_library( android-lib android C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/platforms/android-28/arch-arm/usr/lib NO_DEFUALT_PATH)

target_link_libraries(native-lib ${log-lib} ${camera-lib} ${media-lib} ${android-lib} lib_tflite lib_opencv )

我的输出:

-- Building for: Visual Studio 15 2017
-- Selecting Windows SDK version 10.0.17763.0 to target Windows 6.1.7601.
-- The C compiler identification is MSVC 19.16.27035.0
-- The CXX compiler identification is MSVC 19.16.27035.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/
2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/
2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studi
o/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studi
o/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done

【问题讨论】:

  • 1.工具链文件(CMAKE_TOOLCHAIN_FILE 变量)应设置 之前 project() 调用。最好在命令行中指定工具链文件,如that answer。 2.如果你不想使用Visual Studio(Building for: Visual Studio 15 2017这一行),那么你需要使用-G选项传递正确的generator
  • @Tsyvarev 谢谢你的帮助。现在我得到输出: ninja: fatal: CreateProcess: %1 is not a valid Win32 application.cpp.o 到目前为止我还没有找到解决方法。
  • 打印%1而不是真实路径实际上是Ninja的问题(如that)。但是 Ninja 告诉你你想要执行一个不能在 Windows 上执行的文件。在 Windows 上,可执行文件通常具有扩展名 .exe,但您的编译器 (aarch64-linux-android28-clang) 没有此扩展名。您确定编译器打算在 Windows 上运行吗?可能,您想改用 MSYS 或 MinGW。如果是,则选择合适的 CMake 生成器。
  • 嗯,好吧。 MinGW Makefiles 出现类似错误:[100%] Linking CXX shared library libnative-lib.so Error running link command: %1 is not a valid Win32 application make[2]: *** [CMakeFiles\native-lib.so dir\build.make:134: libnative-lib.so] 错误 2 make[1]: *** [CMakeFiles\Makefile2:75: CMakeFiles/native-lib.dir/all] 错误 2 make: *** [Makefile :83: 全部] 错误 2
  • 你检查过that question关于类似的错误信息吗?

标签: android cmake


【解决方案1】:

“项目”调用建立了您将用于编译代码的工具链。

cmake_minimum_required(VERSION 3.10.2)

# Must establish toolchain code before first project call!
set(CMAKE_TOOLCHAIN_FILE "C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake")
set(ANDROID_ABI arm64-v8a)
set(TOOLCHAIN "C:/Users/myusername/AppData/Local/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64")
set(CC ${TOOLCHAIN}/bin/aarch64-linux-android28-clang)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN}/bin/aarch64-linux-android28-clang++)
set(CMAKE_C_COMPILER ${TOOLCHAIN}/bin/aarch64-linux-android28-clang)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN}/bin/aarch64-linux-android28-clang++)

project(TEST)

【讨论】:

  • 谢谢,这很有帮助。现在我得到输出: ninja: fatal: CreateProcess: %1 is not a valid Win32 application.cpp.o 到目前为止我还没有找到解决方法。
  • 不用担心。请在另一篇文章中提出您的问题,以便我可以更好地帮助您。
猜你喜欢
  • 2021-05-03
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多