暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Windows平台上手工编译Pro*C源代码到EXE可执行文件

原创 Oracle6 2024-07-23
161

【引言】

  以下是一次手工编译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头文件**

001.png

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**

003.png

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

002.png

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

004.png
005.png
006.png

**预编译成功!**

007.png

(四). **『难点』编译.c源代码,生成.exe可执行程序**

**注意gcc的版本及CPU类型,否则报错!**

**本机环境:CPU-intel I5;cygwin_NT-6.1 GCC 5.4.0**

**采用Cygwin编译Pro*C:**

008.png

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

故障频出,哈哈哈!

009.png

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

010.png

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

011.png

下载安装i686-w64-mingw32辅助工具:

https://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains targetting Win32/Personal Builds/mingw-builds/5.4.0/threads-win32/sjlj/i686-5.4.0-release-win32-sjlj-rt\_v5-rev0.7z?viasf=1

手工生成liboci.a库文件,详见参考文献3)。

012.png

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

013.png

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

014.png

**使用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:

015.png

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

016.png

【小结】

  一个专门开发数据库的软件公司,先后在数据库中引入了 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

最后修改时间:2024-07-23 18:26:28
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论