一、错误描述
在编写一个NDK项目的时候,出现编译错误,如下所示:
vlog.basic-opengl | debug | armeabi-v7a Compiler exited with error code 1:
C:\Android\SDK\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe -xc++ --target=armv7-none-linux-androideabi19 --gcc-
toolchain=C:/Android/SDK/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64
--sysroot=C:/Android/SDK/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64/sysroot
-DXtcOpenGL_EXPORTS -ID:/GitLab Source/Vlog_2022/basic-opengl/src/main/cpp/jni
-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables
-fstack-protector-strong -no-canonical-prefixes -fno-addrsig
-march=armv7-a -mthumb -Wa,--noexecstack -Wformat -std=c++11
-O0 -fno-limit-debug-info -fPIC -fpch-preprocess -v -dD -E Android (5220042 based on r346389c)
clang version 8.0.7 (https://android.googlesource.com/toolchain/clang b55f2d4ebfd35bf643d27dbca1bb228957008617) (https://android.googlesource.com/toolchain/llvm
3c393fe7a7e13b0fba4ac75a01aa683d7a5b11cd) (based on LLVM 8.0.7svn)
Target: armv7-none-linux-android19 Thread model: posix InstalledDir:
C:\Android\SDK\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\bin Found candidate GCC installation: C:/Android/SDK/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi\4.9.x Selected GCC installation:
C:/Android/SDK/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x Candidate multilib: thumb;
@mthumb Candidate multilib: armv7-a;
@march=armv7-a Candidate multilib: armv7-a/thumb;
@march=armv7-a@mthumb Candidate multilib: .;
Selected multilib: armv7-a/thumb;@march=armv7-a@mthumb clang++: error: no such file or directory: 'Source/Vlog_2022/basic-opengl/src/main/cpp/jni'
然后所有的C++代码全部爆红,如下所示:
二、分析错误
2.1 错误信息
找到最后一行,报错信息如下:
Selected multilib: armv7-a/thumb;@march=armv7-a@mthumb clang++:
error: no such file or directory: 'Source/Vlog_2022/basic-opengl/src/main/cpp/jni'
提示找不到'Source/Vlog_2022/basic-opengl/src/main/cpp/jni'
目录。
2.2 分析CmakeLists.txt
在CmakeLists.txt,我添加了include_directories
配置,指定了几个目录,如下所示:
#incLude
include_directories(
jni
render
sample
sample/filter
utils
)
看起来是没有任何问题的。应该不是代码的问题,继续分析!
2.3 分析项目路径
项目路径为:D:\GitLab Source\Vlog_2022
报错的目录为:D:\GitLab Source\Vlog_2022\basic-opengl\src\main\cpp\jni
2.4 分析差异
- 提示找不到目录地址为:
'Source/Vlog_2022/basic-opengl/src/main/cpp/jni'
- 报错实际的目录地址为:
D:\GitLab Source\Vlog_2022\basic-opengl\src\main\cpp\jni
尼玛,这是什么鬼!!!
2.5 移动项目
看起来是Android Studio中的CMake出现了问题,导致路径识别出错。
我们将项目迁移到一个新的没有空格的路径下,试一试
- 原来项目路径为:
D:\GitLab Source\Vlog_2022
- 迁移后项目路径为:
D:\GitLab\Vlog_2022
没有空格了!!!
没有空格了!!!
没有空格了!!!
重要的事情说三遍!
然后重新编译,编译正常,如下所示:
代码正常:
编译正常:
尼玛,真的是天坑!!!
2.6 题外话
但是这个问题在我另外一个项目,是不存在这样的bug。
算了,暂时分析不出为啥新项目会抽风,暂时把新项目迁移到没有空格的目录下!
三、总结
在Window环境下,最好目录别带空格,否则会出现诡异的问题,排查很久!!!!!!