You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:38:16