VS 17.4.x/17.5.x编译Android C++动态共享库项目失败求助
解决Visual Studio 17.4.x/17.5.x下Android NDK r16b编译链接错误
问题背景
Windows 11系统中,GnollHack项目的gnollhackdroid Android C++动态库项目在Visual Studio 17.3.4中可正常编译,但升级到17.4.x或17.5.x版本后编译失败。手动指定NDK r16b路径后,链接器出现找不到crtbegin_so.o、crtend_so.o以及-lm/-lc等系统库的错误。
错误日志
6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find crtbegin_so.o: No such file or directory 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -lm 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -lc 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -llog 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -landroid 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -ldl 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -lc 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -ldl 6>C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find crtend_so.o: No such file or directory 6>clang.exe: error: linker command failed with exit code 1 (use -v to see invocation) 6>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Application Type\Android\3.0\Android.Common.targets(125,5): error MSB6006: "clang.exe" exited with code 1. 6>Done building project "gnollhackdroid.vcxproj" -- FAILED.
关联MSBuild任务代码
<ClangLink BuildingInIDE = "$(BuildingInsideVisualStudio)" GNUMode="$(GNUMode)" ClangVersion="$(ClangVersion)" MSVCErrorReport="$(MSVCErrorReport)" Sources="@(Link)" AdditionalLibraryDirectories="%(Link.AdditionalLibraryDirectories)" AdditionalOptions="%(Link.AdditionalOptions)" AdditionalDependencies="%(Link.AdditionalDependencies)" FunctionBinding="%(Link.FunctionBinding)" ForceSymbolReferences="%(Link.ForceSymbolReferences)" GenerateMapFile="%(Link.GenerateMapFile)" GccToolChain="$(GccToolchainPrebuiltPath)" IncrementalLink="%(Link.IncrementalLink)" IgnoreSpecificDefaultLibraries="%(Link.IgnoreSpecificDefaultLibraries)" LibraryDependencies="%(Link.LibraryDependencies)" LinkDLL="%(Link.LinkDLL)" NoExecStackRequired="%(Link.NoExecStackRequired)" DebuggerSymbolInformation="%(Link.DebuggerSymbolInformation)" OptimizeForMemory="%(Link.OptimizeForMemory)" OutputFile="$(LinkOutputFile)" Relocation="%(Link.Relocation)" SharedLibrarySearchPath="%(Link.SharedLibrarySearchPath)" ShowProgress="%(Link.ShowProgress)" Soname="%(Link.Soname)" Sysroot="$(SysrootLink)" TargetArch="$(ClangTarget)" UnresolvedSymbolReferences="%(Link.UnresolvedSymbolReferences)" Version="%(Link.Version)" VerboseOutput="%(Link.VerboseOutput)" WholeArchiveBegin="%(Link.WholeArchiveBegin)" WholeArchiveEnd="%(Link.WholeArchiveEnd)" MinimalRebuildFromTracking="%(Link.MinimalRebuildFromTracking)" TrackFileAccess="$(TrackFileAccess)" TrackedOutputFilesToIgnore ="@(LinkTrackedOutputFilesToIgnore)" TrackerLogDirectory="$(TLogLocation)" TLogReadFiles="@(LinkTLogReadFiles)" TLogWriteFiles="@(LinkTLogWriteFiles)" ToolExe="$(ClangToolExe)" ToolPath="$(ClangToolPath)" ToolArchitecture="$(LinkToolArchitecture)" TrackerFrameworkPath="$(LinkTrackerFrameworkPath)" TrackerSdkPath="$(LinkTrackerSdkPath)" EnableExecuteTool="$(ClangEnableExecuteTool)" > <Output TaskParameter="SkippedExecution" PropertyName="LinkSkippedExecution" /> </ClangLink>
解决方案
- 修复Sysroot路径配置:Visual Studio 17.4+对NDK路径解析逻辑有调整,需确保
SysrootLink指向NDK r16b对应架构的sysroot目录。以aarch64架构、Android API 24为例,路径应为C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r16b\platforms\android-24\arch-arm64,需根据项目实际API级别修改。可通过项目属性配置属性->C/C++->常规中的Android NDK Sysroot设置,或直接在vcxproj文件中手动指定SysrootLink的值。 - 添加链接库搜索目录:在项目属性
配置属性->链接器->常规的附加库目录中,添加以下路径(按对应架构调整):$(AndroidNDKRoot)\platforms\android-[API级别]\arch-[架构]\usr\lib$(AndroidNDKRoot)\toolchains\[架构]-linux-android-4.9\prebuilt\windows-x86_64\lib\gcc\[架构]-linux-android\4.9.x
- 升级NDK版本:NDK r16b版本较旧,VS 17.4+对新版NDK兼容性更好。尝试切换到NDK r21e或r25b,在VS中更新NDK路径后重新配置项目的Android API级别与工具链。
- 强制指定Sysroot参数:临时修改
Android.Common.targets中的ClangLink任务,在AdditionalOptions中添加--sysroot=$(SysrootLink),确保clang使用指定的sysroot查找库文件。 - 清理重建项目:修改配置后,执行
生成->清理解决方案,删除项目的obj和bin目录,再重新构建,避免旧配置缓存干扰。
内容的提问来源于stack exchange,提问作者Tommi Gustafsson
相关产品推荐
相关产品推荐

