c++ - 如何解决 mingw-w64 MSVCRT 依赖问题
问题描述
我正在使用 Go1.12 + msys2/mingw-w64(9.2.0) 构建一个 golang 项目,它显示错误:
D:\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1
D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o: in function `pre_c_init':
E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:146: undefined reference to `__p__fmode'
D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o: in function `__tmainCRTStartup':
E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:290: undefined reference to `_set_invalid_parameter_handler'
D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:299: undefined reference to `__p__acmdln'
D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-merr.o): in function `_matherr':
E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/merr.c:46: undefined reference to `__acrt_iob_func'
D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-pseudo-reloc.o): in function `__report_error':
E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/pseudo-reloc.c:149: undefined reference to `__acrt_iob_func'
D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/pseudo-reloc.c:150: undefined reference to `__acrt_iob_func'
collect2.exe: error: ld returned 1 exit status
经过一番研究,我确定这是 mingw64 的 msvcrt 兼容性问题。我知道有这样的解决方法:未解析的外部符号 __imp__fprintf 和 __imp____iob_func, SDL2 但它并不能解决我的所有问题。
我尝试链接库:LDFLAGS:-L%filepath% -llegacy_stdio_definitions,没有任何变化。
是否有修复它的补丁,或者我必须构建我的自定义版本的 mingw64?
解决方案
所以我自己回答我的问题,这个案子已经结案了。
是的,Mingw64 使用 msvcrt。
这里有一些技巧可以帮助解决 Mingw64 和 msvcrt 之间的依赖问题。主要目标是让编译器加载正确版本的 MSVCRT 库系列。
1.更新Mingw64。
2.查看Mingw64 \include_mingw.h(或x86_64-w64-mingw32\include)中的MSVCRT_VERSION,确保版本号与您的windows版本匹配,或者修改它。
3.看看像“#cgo LDFLAGS: -Lxxx”这样的链接器选项,不要弄乱库路径。删除任何不必要的库路径设置,让链接器自己找到库。
- 确保一切都是用相同的库构建的。
推荐阅读
- reactjs - 自定义钩子和主要组件中的状态
- javascript - React:为什么批量更新不适用于异步作品?
- python - CVXPY 中具有优化变量的块矩阵
- c - GCC 发出的标签不会被该标签之外的任何东西跳转到?
- javascript - 检查是否所有异步 http 请求都已完成
- python - 如何通过 Hamming 或 Levenshtein 距离对字符串进行聚类
- linux - 在错误的家中创建目录
- python - 通过线性评估进行迁移学习:SimCLR,高损失值(损失:28494.7827)
- python - 我可以在 R 中使用什么来导入行星镜图像以将其从辐射转换为反射
- reactjs - 消费者无法通过函数 prop 更新上下文