在Windows中使用Cygwin环境下的gcc编译器编译Informix ESQ/C程序
对于DB2的嵌入SQL程序,有以下步骤:
1)编写dbconn.sqc程序(一个简单的连接数据库,查询并显示的例子)2)在Cygwin命令行中键入 db2cmd 启动一个新的db2命令行窗口
在db2命令行窗口中:
3)预编译
db2 prep dbconn.sqc
生成dbconn.c文件
4)编译
gcc -I"C:\Program Files\IBM\SQLLIB\include" dbconn.c "C:\Program Files\IBM\SQLLIB\lib\db2api.lib"
生成a.exe文件
在C程序>文章中提到在使用gcc编译时如果路径中包含空格的路径,就不能正确解析。
这次发现可以将路径用双引号引起来就可以了。
5)执行a.exe,成功
如果需要生成外部绑定文件,(db2执行预编译时默认是做绑定了)
1)db2 prep dbconn.sqc bindfile
生成
dbconn.c, dbconn.bnd
2)手工绑定
db2 bind dbconn.bnd
3)绑定完后一定要重新编译,否则报-818,
db2 ? SQL0818
预编译时由预编译器生成的时间戳记与绑定时存在的包内的时间戳记不同
附录1
dbconn.sqc程序
#include
#include
#include
int main()
{
EXEC SQL INCLUDE SQLCA
EXEC SQL BEGIN DECLARE SECTION
char firstnme[12+1]
EXEC SQL END DECLARE SECTION
long RetCode = SQL_RC_OK
char ErrorMsg[1024]
EXEC SQL CONNECT TO sample USER zhangjij USING happyday
EXEC SQL SELECT firstnme INTO :firstnme FROM employee WHERE empno='000099'
if (sqlca.sqlcode != SQL_RC_OK)
{
RetCode = sqlaintp(ErrorMsg, sizeof(ErrorMsg), 70, &sqlca)
switch (RetCode)
{
case -1:
printf("ERROR: Insufficient memory.\n")
break
case -3:
printf("ERROR: Message file is inaccessible.\n")
break
case -5:
printf("ERROR: Invalid SQLCA, bad buffer, or bad buffer length specified.\n")
break
default:
printf("sqlca.sqlcode=[%ld], Message= [%s] \n", sqlca.sqlcode, ErrorMsg)
break
}
}
printf("OK = [%s] \n", firstnme)
EXEC SQL DISCONNECT CURRENT
return(0)
}
cygwin可以编译生成windows下供调用的dll,包括vc可识别的lib。Cygwin-GCC : Cygwin自带了一个GCC, 用于把C/C++-Source编译成Cygwin平台下的EXE/DLL (使用Cygwin必须用其自带的GCC, 因为内部会生成一些针对于平台的特定的初始化代码, 如果用其余版本的GCC则很有可能导致程序不能正常运行.)
Cygwin-GCC : Cygwin自带了一个GCC, 用于把C/C++-Source编译成Cygwin平台下的EXE/DLL (使用Cygwin必须用其自带的GCC, 因为内部会生成一些针对于平台的特定的初始化代码, 如果用其余版本的GCC则很有可能导致程序不能正常运行.)
说明 - Cygwin-GCC :
在Cygwin-Shell中可直接使用gcc . 如下 :
gcc -shared xxx.c -o xxx.dll //编译成DLL, 注意, Cygwin-GCC默认导出所有的Function.
gcc -c xxx.c -o xxx.o //编译成OBJ
gcc xxx.c -o xxx.exe //编译成EXE
ar r xxx.lib xxx1.o xxx2.o //打包多个obj成一个Lib (非连接)
gcc xxx.c ./L aaa.dll -o xxx.exe //引用外部DLL生成EXE
gcc xxx.c yyy.c -o zzz.exe //连接多个C文件, 生成EXE.
gcc -I"/bin/include" -c xxx.c -o xxx.o //引用/bin/include目录下头文件,生成OBJ
gcc -L"dll.a" xxx.c -o xxx.exe //连接dll.a, 生成EXE
如果想知道编译时具体的信息, 可以使用--verbose这个编译选项, 对于了解GCC的工作是很有帮助的.
额外的,也可以写自己的导出Lib文件, 以方便其余程序引用DLL (如Cobol2002编译器就不支持直接引用DLL, 这个时候可以写一个Def, 并导出Lib文件, 便于Cobol2002使用)
具体方法如下:
1. 编译生成DLL :
如: gcc -shared MyTest.c -o MyTest.dll, 生成MyTest.dll.
2. 写一个DEF文件 (这里是MyTest.def), 简单的格式大致如下:
LIBRARY MyTest //这里的MyTest对应于MyTest.dll
EXPORTS
AllocMemory @1 //导出的第一个function : 对应于MyTest.dll里面的AllocMemory(...), 注意, 参数可不用写
ReadMemory @2 //导出的第二个function : 对应于MyTest.dll里面的ReadMemory-Function.
//注意: function可以不用全部导出, 可以只选择你需要的Function.
3. 用LIB工具(VC6有提供)生成LIB文件 (这里是MyTest.lib) :
lib /def:MyTest.def //默认生成的名称为MyTest.lib.
4. 到此生成完毕, 连接的时候只需要引用MyTest.lib即可, 但要注意XXX.exe 和MyTest.dll要放在同一目录下.
可以用 gcc --help 查看具体的命令 etc...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)