1.CMakeLists.txt 文件的编写
- 当你需要指定头文件事,需要将头文件的包路径也指定
include_directories(你的包名) - 举个例子
我的需要加入
include_directories(idr)
2.代码源文件引入:
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
将我们需要用到的源文件指定;
第一个是生成的库名称,第二个表示库的类型(STATIC和SHARED)。
后面的参数是你需要导入的源文件;(头文件不需要)。
3.引入第三方库
上面是引入第三方库的方式;与1.2相同,唯一的一个是需要set_target_properties
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
引入第三方库后,需要最后一步——关联所有库:
注意:这一步的库使用顺序一定要按照要求来!顺序不能随便写;
3.关于编译的一些错误
3.1
- fatal error: asm/types.h: No such file or directory
详细报错如下:
3. Build command failed.
4. Error while executing process C:\\androidSDK\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1q3v3a1v\arm64-v8a rk3568Qrcode}
5. ninja: Entering directory `C:\\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1q3v3a1v\arm64-v8a'
6. [1/3] Building C object CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o
7. FAILED: CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o
8. C:\\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -Drk3568Qrcode_EXPORTS -IC://androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/inc -IC://androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC -O0 -fPIC -MD -MT CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o -MF CMakeFiles\rk3568Qrcode.dir\rk3568_qrcode.c.o.d -o CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o -c C://androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/rk3568_qrcode.c
9. In file included from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sys/types.h:36:0,
10. from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/bits/timespec.h:33,
11. from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sched.h:32,
12. from C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/rk3568_qrcode.c:14:
13. C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/linux/types.h:21:23: fatal error: asm/types.h: No such file or directory
14. #include <asm/types.h>
15. ^
16. compilation terminated.
17. [2/3] Building C object CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o
18. FAILED: CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o
19. C:\111\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -Drk3568Qrcode_EXPORTS -IC:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/inc -IC:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC -O0 -fPIC -MD -MT CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o -MF CMakeFiles\rk3568Qrcode.dir\idr_test_lib.c.o.d -o CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o -c C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr_test_lib.c
20. In file included from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sys/types.h:36:0,
21. from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sys/time.h:33,
22. from C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr_test_lib.c:13:
23. C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/linux/types.h:21:23: fatal error: asm/types.h: No such file or directory
24. #include <asm/types.h>
25. ^
26. compilation terminated.
27. ninja: build stopped: subcommand failed.
该错误是找不到系统的一些头文件,改动方式是在CmakeLists中加入
if (${ANDROID_ABI} STREQUAL "armeabi-v7a") include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) else () include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) endif ()
3.2 undefined reference to `stderr'
该报错的完整错误提示如下
[3/3] Linking C shared library C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1q3v3a1v\obj\arm64-v8a\librk3568Qrcode.so
FAILED: C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/build/intermediates/cxx/Debug/1q3v3a1v/obj/arm64-v8a/librk3568Qrcode.so
cmd.exe /C "cd . && C:\111\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -fPIC -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC -O0 -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot C:/111/androidSDK/Sdk/android-ndk-r16b/platforms/android-21/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,librk3568Qrcode.so -o C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1q3v3a1v\obj\arm64-v8a\librk3568Qrcode.so CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_det_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rsz_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_atc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_loc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rec_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libamai_runtime_r1.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libmpimmz.so C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++_static.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++abi.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libandroid_support.a -lm -ldl -llog -latomic -lm && cd ."
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmMsg':
(.text.drmMsg+0x9c): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmMsg':
(.text.drmMsg+0xa0): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmWaitVBlank':
(.text.drmWaitVBlank+0x108): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmWaitVBlank':
(.text.drmWaitVBlank+0x10c): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmError':
(.text.drmError+0x34): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o):(.text.drmError+0x38): more undefined references to `stderr' follow
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xd8): undefined reference to `inflateInit2_'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xf4): undefined reference to `inflate'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xfc): undefined reference to `inflateEnd'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
主要的报错是 undefined reference to `stderr'
标准错误;
这个错误主要是跟你的编译环境有关系,需要你明确知道自己应该是Android最低多少版本中编译。
查看你编译使用的NDK版本中的Android最低支持的版本; 然后在项目的build.gradle文件中添加:
arguments '-DANDROID_PLATFORM=android-24'
其中Android版本是你使用环境支持的版本,看你需要用哪个。
添加的地方:
2.3 undefined reference to `inflateInit2_'
Build command failed.
Error while executing process C:\111\androidSDK\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1p06p3h3\arm64-v8a rk3568Qrcode}
ninja: Entering directory `C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1p06p3h3\arm64-v8a'
[1/1] Linking C shared library C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1p06p3h3\obj\arm64-v8a\librk3568Qrcode.so
FAILED: C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/build/intermediates/cxx/Debug/1p06p3h3/obj/arm64-v8a/librk3568Qrcode.so
cmd.exe /C "cd . && C:\111\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -fPIC -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC -O0 -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot C:/111/androidSDK/Sdk/android-ndk-r16b/platforms/android-24/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,librk3568Qrcode.so -o C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1p06p3h3\obj\arm64-v8a\librk3568Qrcode.so CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_det_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rsz_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_atc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_loc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rec_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libamai_runtime_r1.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libmpimmz.so C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++_static.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++abi.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libandroid_support.a -lm -ldl -llog -latomic -lm && cd ."
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xd8): undefined reference to `inflateInit2_'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xf4): undefined reference to `inflate'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xfc): undefined reference to `inflateEnd'
collect2.exe: error: ld returned 1 exit status
解决方案如下:
在CmakeLists.txt 中 添加
link_libraries(z)
添加的位置在
之前就行;
解决完这些,本次就编译通过了!