GnuCOBOL调用MySQL C API的mysql_init函数找不到问题求助
解决GnuCOBOL调用MySQL C API时
mysql_init模块找不到的问题 问题分析
编译成功但运行时提示libcob: mysql1.cob:17: error: module 'mysql_init' not found,核心原因有两个:
- 运行时系统无法定位
libmysql.dll动态库,导致GnuCOBOL加载不到目标函数 - COBOL与C的函数符号命名规则不匹配(Windows下C函数默认会添加下划线前缀,如
_mysql_init,而COBOL直接调用mysql_init会找不到对应符号)
解决方案
1. 确保运行时能加载libmysql.dll
- 方法一:将
C:\Program Files\MySQL\MySQL Server 8.0\lib路径添加到系统PATH环境变量中,添加后重启命令行窗口再运行程序 - 方法二:直接复制
libmysql.dll文件到生成的mysql1.exe所在的目录下
2. 修正COBOL调用的符号名
修改CALL语句,通过ALIAS子句指定C函数的实际导出符号(Windows下通常带下划线前缀):
PROCEDURE DIVISION. * Step 1: Open the MySQL connection CALL "mysql_init" ALIAS "_mysql_init" USING DB-CONNECTION-HANDLE END-CALL IF DB-CONNECTION-HANDLE = 0 DISPLAY "Failed to initialize MySQL connection." STOP RUN END-IF
如果不确定实际符号名,可以用dumpbin /exports "C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.dll"命令查看mysql_init的导出名称,再替换到ALIAS中。
3. 编译时指定符号命名规则
在编译命令中添加-fimplicit-underscore选项,让GnuCOBOL自动为C函数调用添加下划线前缀,无需修改代码:
cobc -d -v -x -o mysql1 mysql1.cob -fimplicit-underscore -L"C:\Program Files\MySQL\MySQL Server 8.0\lib" -llibmysql
验证
按照上述任一方案修改后,重新编译并运行mysql1.exe,即可解决模块找不到的问题。
内容的提问来源于stack exchange,提问作者Aulis Lappalainen
相关产品推荐
相关产品推荐

