【引言】
以下是一次手工编译Pro*C程序的“撞墙”日记。
搭眼一看,乱八七糟。
细心的读者,或许可以看出,其中某些地方留下了作者努力过的痕迹,尽管没留下什么有趣的经验,也谈不上什么教训,但既然叫“撞墙”,那索性就把四围的山墙和跟角都撞撞,唯因如此,不光能对得住吃过的瘪,或许对读者也还能有所裨益。
(一). **在Windows下编辑一个pproc.pc程序,代码如下:**
#include <stdio.h>
#include <string.h>
EXEC SQL INCLUDE SQLCA;
int main()
{
/*declare variables*/
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR usr[20], pass[20], serv[20];
char name[8];
int age;
EXEC SQL END DECLARE SECTION;
/*connect DB*/
strcpy(usr.arr,"any3");
usr.len=(unsigned short)strlen((char *)usr.arr);
strcpy(pass.arr,"any3");
pass.len=(unsigned short)strlen((char *)pass.arr);
strcpy(serv.arr,"ORCL");
serv.len=(unsigned short)strlen((char *)serv.arr);
/*Connecting DB Command*/
EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv;
printf("Connect!");
/*Input*/
printf("Input Member Age:");
scanf("%d", age);
/*Exec SQL*/
EXEC SQL SELECT age, name into :age, :name from family_lu where age=:age;
printf("Name=%s ,Age=%d", name, age);
/*commit and disconnect DB*/
EXEC SQL COMMIT WORK RELEASE;
printf("Disconnect!");
return 1;
}
(二). **创建测试用户及示例表**
SQL\> connect any3/any3
SQL\> CREATE TABLE family_lu
2 (
3 age number,
4 name varchar2(20),
5 reltn varchar2(20)
6 );
SQL\> insert into family_lu values(0, ‘anan’, ‘child’);
SQL\> insert into family_lu values (99,‘三皇五帝’,‘夏商周’);
Commit;
(三). **『关键』使用Oracle_HOME下bin目录中的Proc.exe预编译该.pc文件,生成相应的c语言源程序。**
1. **准备include基础库依赖的 .h头文件**

2. **预编译Pro*C文件,生成C语言代码:**
**proc oracle-ascii-unload.pc parse=full**
**proc oracle-ascii-unload.pc parse=none**
**proc oracle-ascii-unload.pc parse=none code=CPP**

**对于结构体Time_t,引用其root头文件time.h**

**再编译,通过!mark一下:**



**预编译成功!**

(四). **『难点』编译.c源代码,生成.exe可执行程序**
**注意gcc的版本及CPU类型,否则报错!**
**本机环境:CPU-intel I5;cygwin_NT-6.1 GCC 5.4.0**
**采用Cygwin编译Pro*C:**

Cygwin是一个在windows平台上运行的类UNIX模拟环境,是Cygnus
Solutions公司开发的自由软件。它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用。
故障频出,哈哈哈!

手工复制依赖的头文件sqlda.h sqlcpr.h sqlca.h oraca.h

继续编译,先报undefined 错,再报找不到-lclntsh

下载安装i686-w64-mingw32辅助工具:
手工生成liboci.a库文件,详见参考文献3)。

以oci模式继续编译,错误依旧,至此,陷入死胡同,暂时放弃

**使用X86-64编译pproc,报“信号11”中断错误:**

**使用intel i686编译pproc,成功!**
c:\cygwin64\bin\i686-w64-mingw32-gcc-5.4.0.exe pproc.c D:\oracle\ora11204\BIN\oci.dll -o pproc
编译结果如下图,.pc———》.c——》.exe:

(五). **执行编译成功的程序**

【小结】
一个专门开发数据库的软件公司,先后在数据库中引入了 3GL(第三代编程语言)、Pro*C、Java虚拟机、JavaScript语言,不仅如此,今年上半年还推出内嵌Ai功能的向量式DB。
不消说,她的过去是“熠熠生辉”的,她的未来是“难以预期”的,可是,过往的历史表明,未来又有什么是好预期的呢?
参考文献
1. Pro*C编程研究一:从.pc到.exe
https://www.cnblogs.com/lvdongjie/p/3755139.html
2. MINGW32环境下链接库找不到问题
https://www.cnblogs.com/Dreaming-in-Gottingen/p/13975519.html
3. Are you sure of libaio.dll need for Oracle on Cygwin ?
https://github.com/vanhauser-thc/thc-hydra/issues/520
4. undefined reference to `sqlcxt’ (Pro C compilation problem)
https://bytes.com/topic/oracle/64095-undefined-reference-sqlcxt-pro-c-compilation-problem




