【发布时间】: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关于类似的错误信息吗?