Windows下gRPC v1.60.1 C++依赖构建失败:curve25519_64_adx未定义引用
构建gRPC C++项目时bssl链接错误(Windows + MinGW)
问题描述
尝试构建gRPC v1.60.1的C项目,使用MinGW GCC 13.1.0编译,C标准设为C++23。在完成2000+项依赖构建后,链接bssl.exe时出现未定义引用错误。
环境信息
- gRPC版本:v1.60.1
- 操作系统:Windows
- C标准:C23
- GCC版本:13.1.0(x86_64-win32-seh-rev1,MinGW-Builds项目构建)
CMakeLists.txt内容
cmake_minimum_required (VERSION 3.8) set(COMMON_PROJECT_CPP_STANDARD 23 ON CACHE BOOL "" FORCE) set(protobuf_INSTALL OFF) set(utf8_range_ENABLE_INSTALL OFF) FetchContent_Declare( gRPC GIT_REPOSITORY https://github.com/grpc/grpc GIT_TAG v1.60.1 ) set(FETCHCONTENT_QUIET OFF) FetchContent_MakeAvailable(gRPC) set(_PROTOBUF_LIBPROTOBUF libprotobuf) set(_REFLECTION grpc++_reflection) set(_PROTOBUF_PROTOC $<TARGET_FILE:protoc>) set(_GRPC_GRPCPP grpc++) if(CMAKE_CROSSCOMPILING) find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) else() set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>) endif()
构建错误输出
====================[ Build | all | x64-Win-Debug-MinGW-GNU ]=================== X:\Progs\JetBrains\CLion\bin\cmake\win\x64\bin\cmake.exe --build D:\0my\pr0jects\CnC++\network\grpc\build\x64-win-debug-mingw-gnu --target all -j 6 [1/5] Linking CXX executable src\client\grpc_client.exe [2/5] Linking CXX executable src\server\grpc_server.exe [3/5] Linking CXX static library _deps\grpc-build\libgrpcpp_channelz.a [4/5] Linking CXX executable _deps\grpc-build\third_party\boringssl-with-bazel\bssl.exe FAILED: _deps/grpc-build/third_party/boringssl-with-bazel/bssl.exe cmd.exe /C "cd . && X:\Progs\JetBrains\CLion\bin\mingw\bin\g++.exe -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti -g _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/args.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/ciphers.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/client.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/const.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/digest.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/fd.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/file.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/generate_ech.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/generate_ed25519.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/genrsa.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/pkcs12.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/rand.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/server.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/sign.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/speed.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/tool.cc.obj _deps/grpc-build/third_party/boringssl-with-bazel/CMakeFiles/bssl.dir/src/tool/transport_common.cc.obj -o _deps\grpc-build\third_party\boringssl-with-bazel\bssl.exe -Wl,--out-implib,_deps\grpc-build\third_party\boringssl-with-bazel\libbssl.dll.a -Wl,--major-image-version,0,--minor-image-version,0 _deps/grpc-build/third_party/boringssl-with-bazel/libssl.a _deps/grpc-build/third_party/boringssl-with-bazel/libcrypto.a -lws2_32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ." X:\Progs\JetBrains\CLion\bin\mingw\bin/ld.exe: _deps/grpc-build/third_party/boringssl-with-bazel/libcrypto.a(curve25519_64_adx.c.obj): in function `fe4_mul': Z:/projects/cpp/network/mygrpc/build/x64-win-debug-mingw-gnu/_deps/grpc-src/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h:16: undefined reference to `fiat_curve25519_adx_mul' X:\Progs\JetBrains\CLion\bin\mingw\bin/ld.exe: _deps/grpc-build/third_party/boringssl-with-bazel/libcrypto.a(curve25519_64_adx.c.obj): in function `fe4_sq': Z:/projects/cpp/network/mygrpc/build/x64-win-debug-mingw-gnu/_deps/grpc-src/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h:19: undefined reference to `fiat_curve25519_adx_square' collect2.exe: error: ld returned 1 exit status [5/5] Linking CXX executable src\client\grpc_client_test.exe ninja: build stopped: subcommand failed.
解决方案
这个错误源于MinGW GCC默认启用ADX指令集优化,但BoringSSL的Fiat曲线实现未正确链接对应汇编函数,可通过以下方式解决:
- 禁用ADX指令集优化
在FetchContent_MakeAvailable(gRPC)之前添加编译选项,强制关闭ADX支持:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mno-adx") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-adx")
- 跳过bssl工具构建
若不需要bssl.exe工具,可直接构建自身项目目标,而非all:
cmake --build <你的构建目录> --target grpc_client grpc_server grpc_client_test -j 6
- 升级gRPC版本
该问题在gRPC v1.65+版本中已修复,可尝试升级版本后重新构建。
内容的提问来源于stack exchange,提问作者Lesnov
相关产品推荐
相关产品推荐

