C:\gnuCobol>cobc -d -v -x -o mysql1 mysql1.cob -L"C:\Program Files\MySQL\MySQL Server 8.0\lib" -llibmysql
cobc (GnuCOBOL) 3.2.0
Built Jul 28 2023 16:08:08 Packaged Jul 28 2023 16:58:47 UTC
C version (MinGW) "13.1.0"
loading standard configuration file 'default.conf'
command line: cobc -d -v -x -o mysql1 -LC:\Program Files\MySQL\MySQL Server 8.0\lib -llibmysql mysql1.cob
preprocessing: mysql1.cob -> C:\Users\Omistaja\AppData\Local\Temp\cob83652_0.cob
return status: 0
parsing: C:\Users\Omistaja\AppData\Local\Temp\cob83652_0.cob (mysql1.cob)
return status: 0
translating: C:\Users\Omistaja\AppData\Local\Temp\cob83652_0.cob -> C:\Users\Omistaja\AppData\Local\Temp\cob83652_0.c (mysql1.cob)
executing: gcc -c -I"C:\gnuCobol\include" -o
"C:\Users\Omistaja\AppData\Local\Temp\cob83652_0.o"
"C:\Users\Omistaja\AppData\Local\Temp\cob83652_0.c"
return status: 0
executing: gcc -Wl,--export-all-symbols -Wl,--enable-auto-import
-Wl,--enable-auto-image-base -o "mysql1.exe"
"C:\Users\Omistaja\AppData\Local\Temp\cob83652_0.o"
-L"C:\gnuCobol\lib" -L"C:\Program Files\MySQL\MySQL Server
8.0\lib" -L/mingw64/lib -lcob -l"libmysql"
return status: 0
C:\gnuCobol>mysql1
libcob: mysql1.cob:17: error: module 'mysql_init' not found
Last statement of "MySQL1" was CALL at line 17 of mysql1.cob
ENTRY MySQL1 at mysql1.cob:17
Started by mysql1
C:\gnuCobol>
--
PROCEDURE DIVISION.
* Step 1: Open the MySQL connection
CALL "mysql_init" USING DB-CONNECTION-HANDLE
END-CALL
IF DB-CONNECTION-HANDLE = 0
DISPLAY "Failed to initialize MySQL connection."
STOP RUN
END-IF
有人知道问题出在哪里吗?
这个
cobc
使用gcc
(和ld
)进行编译/链接,所以这就是当前发生的情况:
您的程序对 C 入口点执行动态
CALL
(这是 GnuCOBOL 的默认设置)。选项:
保持动态
CALL
,预加载库:
cobc -d -v -x -o mysql1 mysql1.cob
(不再有 mysql 的链接选项)
可能在程序中捕获这个(如果你不想硬中止):CALL "mysql_init" USING DB-CONNECTION-HANDLE ON EXCEPTION CONTINUE.
set COB_PRE_LOAD=libmysql
、set COB_LIBRARY_PATH=%COB_LIBRARY_PATH%;C:\Program Files\MySQL\MySQL Server 8.0\lib
(如果里面有libmysql.dll,否则调整)、mysql1
更改为静态
CALL
这需要 -L"\Program Files\MySQL\MySQL Server 8.0\lib" -lmysql
,然后通过以下之一调整 CALL
:
CALL STATIC "mysql_init"
(包括该库中所有其他入口点的调用约定“STATIC”)CALL "mysql_init"
和 cobc -K mysql_init
(包括所有其他入口点的“-K”)CALL "mysql_init"
和 cobc --static
(要强制动态加载,例如对于 COBOL 模块,您需要将它们更改为 MOVE "PROG" TO variable. CALL variable.
保持动态
CALL
并使用 cobc -Q "-Wl,--no-as-needed"
禁用链接器优化
注 1:确保您调用的库使用相同的架构(该路径中的 MySQL 库可能是 x64 - 不确定您的 GnuCOBOL 是否使用相同的架构)。
注2:如果你只是从SQL部分开始,我建议考虑不直接调用MySQL库,而是使用标准的SQL预处理器
EXEC SQL
。