Server 2022下Strawberry Perl安装DBD::mysql链接错误求助
在Server 2022的Strawberry Perl环境中安装DBD::mysql时gmake出现未定义引用错误
我在Server 2022系统的Strawberry Perl环境中安装DBD::mysql,已经解决了多项配置问题,现在执行gmake时遇到了未定义引用错误。
执行的编译命令
g++ mysql.def -o blib\arch\auto\DBD\mysql\mysql.xs.dll -shared -s -L"c:\mysql\install\lib" -L"c:\mysql\install\lib\debug" -L"C:\STRAWB~1\perl\lib\CORE" -L"C:\STRAWB~1\c\lib" -L"C:\STRAWB~1\c\x86_64-w64-mingw32\lib" -L"C:\STRAWB~1\c\lib\gcc\x86_64-w64-mingw32\13.2.0" dbdimp.o mysql.o socket.o "C:\STRAWB~1\perl\lib\CORE\libperl540.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libmoldname.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libkernel32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libuser32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libgdi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libwinspool.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libcomdlg32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libadvapi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libshell32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libole32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\liboleaut32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libnetapi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libuuid.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libws2_32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libmpr.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libwinmm.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libversion.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libodbc32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libodbccp32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libcomctl32.a" -Wl,--enable-auto-image-base
编译错误示例
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: dbdimp.o: in function `mysql_dr_connect': C:/Perl64/cpan/build/DBD-mysql-5.010-0/dbdimp.c:1208:(.text+0xa74): undefined reference to `mysql_server_init' C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Perl64/cpan/build/DBD-mysql-5.010-0/dbdimp.c:1209:(.text+0xa81): undefined reference to `mysql_init'
我用Dependency Walker检查了c:\mysql\install\lib目录下的mysql.dll(编译命令中通过-L"c:\mysql\install\lib"指定路径),确认该文件包含mysql_server_init、mysql_init这些缺失的函数。
现在的疑问:当前命令行配置是否正确?还是我遗漏了其他内容?我不是C程序员,请尽可能详细解答。
问题原因与解决方法
你的编译命令缺少了链接MySQL库的参数。-L参数只是告诉编译器去哪里找库文件,但并没有明确指定要链接哪个MySQL库。
具体修正步骤:
- 确认MySQL库文件名:在
c:\mysql\install\lib目录下,找到对应的导入库——Windows下通常是libmysql.lib,MinGW编译的则是libmysql.a。 - 添加链接参数:在编译命令里的目标文件(
dbdimp.o mysql.o socket.o)之后、系统库(比如libperl540.a)之前,添加-lmysql(对应libmysql.a),或者直接指定库文件的完整路径(比如"c:\mysql\install\lib\libmysql.lib")。
修正后的命令片段示例:
... dbdimp.o mysql.o socket.o -lmysql "C:\STRAWB~1\perl\lib\CORE\libperl540.a" ...
(注:链接器对顺序有要求,依赖的库必须放在使用它的目标文件之后)
为什么会这样?
链接器处理未定义引用时,需要明确知道从哪个库中查找函数。-L只是提供搜索路径,但你必须告诉它具体要链接哪个库。你确认mysql.dll里有这些函数,但编译动态链接库时,需要对应的导入库来让链接器找到函数的入口点。
额外建议:
- 如果手动修改Makefile太麻烦,可重新运行
perl Makefile.PL时明确指定MySQL的库路径和库名:
再执行perl Makefile.PL --mysql-lib=c:\mysql\install\lib --mysql-libname=mysqlgmake和gmake install,生成的Makefile会自动包含正确的链接参数。 - 确保MySQL版本和DBD::mysql版本兼容,DBD::mysql 5.010建议搭配MySQL 5.7或8.0版本,避免版本不匹配引发问题。
内容的提问来源于stack exchange,提问作者Doug Poulin
相关产品推荐
相关产品推荐

