使用arblib库的C程序经GCC编译后可执行文件无法运行
GCC编译Arb库示例程序运行失败(退出码1)的解决方法
问题根源
你通过vcpkg安装的x64-windows版本Arb库是为MSVC编译器编译的,和MinGW GCC的二进制接口(ABI)不兼容。VS2022能正常运行是因为它使用MSVC工具链,而GCC链接MSVC编译的库后,会因函数调用约定、标准库实现差异等问题触发运行时崩溃——arb_printn涉及Flint的IO函数,这类和标准库交互的逻辑最容易暴露ABI冲突问题。
修复步骤
1. 安装MinGW兼容的Arb库版本
卸载原有MSVC版本的Arb库,重新安装适配MinGW的版本:
# 卸载现有x64-windows版本 vcpkg remove arblib:x64-windows --recurse # 安装x64-mingw动态库版本(推荐适配MinGW GCC) vcpkg install arblib:x64-mingw-dynamic --recurse # 或者安装静态库版本 # vcpkg install arblib:x64-mingw-static --recurse
2. 调整编译链接参数
使用MinGW版本库的路径重新编译,确保头文件和库路径指向x64-mingw-dynamic(或x64-mingw-static)目录:
# 动态库版本编译命令 gcc test.c -o ./exe/test -LC:\你的vcpkg路径\installed\x64-mingw-dynamic\lib -IC:\你的vcpkg路径\installed\x64-mingw-dynamic\include -lflint -larb -lmpfr -lgmp # 静态库版本编译命令(需加-static参数) gcc test.c -o ./exe/test -static -LC:\你的vcpkg路径\installed\x64-mingw-static\lib -IC:\你的vcpkg路径\installed\x64-mingw-static\include -lflint -larb -lmpfr -lgmp
注意:链接库的顺序很关键,把依赖其他库的库放在前面(比如
-lflint要在-larb之前,因为Arb依赖Flint)。
3. 调试定位(可选)
如果仍有问题,用GDB调试查看具体崩溃点:
gdb ./exe/test run bt
该命令会输出调用栈,能更精准定位是链接缺失还是ABI适配问题。
内容的提问来源于stack exchange,提问作者Emma Anderson
相关产品推荐
相关产品推荐

