在MSYS2中编译GNU Guile 1.8.8遇未定义引用错误求助
我明白你在Windows下用MSYS2编译老版本Guile 1.8.8时碰到了_imp__scm_shell和_imp__scm_boot_guile未定义引用的问题,这类错误通常和链接时的库引用方式、工具链兼容性有关——毕竟Guile 1.8.8是比较老的版本,和新版MSYS2的工具链可能存在适配问题。下面是几个针对性的解决思路和步骤:
1. 切换到对应MinGW Shell并调整配置参数
首先要确保你用的是MinGW专属Shell(比如打开mingw32.exe编译32位版本,mingw64.exe编译64位版本),而不是默认的MSYS2 Shell。然后执行配置命令时,明确指定主机架构和安装路径,同时强制生成动态库:
# 32位环境 ./configure --host=i686-w64-mingw32 --prefix=/mingw32 --disable-static --enable-shared # 64位环境 ./configure --host=x86_64-w64-mingw32 --prefix=/mingw64 --disable-static --enable-shared
--disable-static --enable-shared参数能避免静态链接时的符号解析问题,老版本Guile在MinGW下动态链接的兼容性更好。
2. 手动调整Makefile的链接选项
如果配置后编译仍报错,大概率是链接器没正确找到Guile的库。找到编译报错对应的Makefile(通常在src目录下),找到LIBS或LDFLAGS相关配置行,添加-lguile和-lgc,并确保库的引用顺序正确(链接器按顺序解析符号,库要放在引用它的目标文件后面):
LIBS = -lm -lguile -lgc
3. 降级Libtool版本适配老代码
你安装的是新版mingw-w64-libtool,而Guile 1.8.8的构建脚本可能和新版Libtool不兼容。可以尝试下载对应Guile发布时期的旧版MinGW Libtool,替换掉MSYS2中的版本,或者在配置时指定旧版Libtool的路径:
./configure LIBTOOL=/path/to/old-libtool-bin/libtool ...
4. 强制指定头文件和库路径
确保编译器能找到Guile的头文件和库文件,配置时通过CPPFLAGS和LDFLAGS明确指定路径:
# 32位环境示例 ./configure CPPFLAGS="-I/mingw32/include" LDFLAGS="-L/mingw32/lib" ...
5. 应用MinGW适配补丁
Guile 1.8.8存在一些MinGW环境下的已知符号导出问题,你可以搜索针对该版本的MinGW补丁(比如修复scm_shell、scm_boot_guile符号导出声明的补丁),将补丁应用到源码后再重新编译。
内容的提问来源于stack exchange,提问作者R. Murdoch

