上班回来,接第一步,这篇说下第二步。
第二步:环境变量配置及撰写Makefile文件
1、Unix环境变量的配置
这里所说的环境变量是指oracle安装的dll等资源路径。因为若cpp文件经过编译链接,执行的时候需要occi资源的支持的,没有支持就会报错说神马dll文件找不到之类。所以在makefile之前可以先把环境变量搞定了,内容很简单,看setenv.sh脚本代码:
ORACLE_HOME=/opt/app/ora10g/product/10.2.0;export ORACLE_HOME PATH=/usr/ccs/bin:$ORACLE_HOME/bin:$PATH;export PATH LD_LIBRARY_PATH=$ORACLE_HOME/lib32:$LD_LIBRARY_PATH;export LD_LIBRARY_PATH
ORACLE_HOME变量是产品根目录,就是有很多文件的上一级
PATH中第一个/usr/ccs/bin是我用的make路径,这样每次就不用绝对地址了,直接make就行了。而$ORACLE_HOME/bin:$PATH很重要。很多的oracle提供可执行文件都在这里。
LD_LIBRARY_PATH=$ORACLE_HOME/lib32就更是重要了,为后面的cpp对应执行文件提供dll。这里多提一下lib和lib32的区别吧,在oracle9i还是10g或更新的oracle,lib32表示的是32位的环境,而lib表示的是64位的环境。所以根据个人情况改写吧,对于makefile也是这样的。见下文内容。
setenv.sh写好了怎么用呢?这是一个shell脚本,可以手动执行./setenv.sh 这样你就能享受这些环境变量了,也可以自动执行,关于怎样自动执行建议看看.profile等文件相关内容,(本人喜欢bash环境,每次运行bash时会自动依次执行.bash_profile、.bashrc所以在.bashrc中加入/setenv.sh即可,我的bashrc内容是:注意看最后一行指明了要运行setenv.sh,所以不用手动了。
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi #open core file ulimit -S -c unlimited > /dev/null 2>&1 #time zone # User specific aliases and functions . ./zxliu/setenv.sh
2、Makefile的编写
在开始调用occi之前,首先需要在helloworld工作目录写一份Makefile文件,起名为makefile均可,make命令首先寻找Makefile,若不存在则会寻找makefile,对了这时也要确认能否执行make命令,如果显示找不到,需要使用绝对地址执行make,如/usr/ccs/bin/make,默认unix均有make执行文件。该Makefile内容如下:
########################################### #Makefile for the OCCI demo programs ########################################### #ORACLE_HOME变量指明unix上的oracle产品路径 ORACLE_HOME=/opt/app/ora10g/product/10.2.0 #ORACLE_INCLUDES变量指明产品路径下的各种include文件$()表示取值,注明这些文件对于后面cpp编译中include occi头文件很重要 ORACLE_INCLUDES=-I$(ORACLE_HOME)/rdbms/demo / -I$(ORACLE_HOME)/rdbms/public / -I$(ORACLE_HOME)/plsql/public / -I$(ORACLE_HOME)/network/public / -I$(ORACLE_HOME)/precomp/public #ORACLE_LIBS变量指明,链接库,编译程序的时候很重要,而INC和LIB是连接程序时候需要的。-I表示引入的是头文件,-L表示引入的是动态链接库,-l表示在-L中连接的文件如clntsh.dll文件和occi.dll文件。所以-l必须和-L配合使用。 ORACLE_LIBS=-L$(ORACLE_HOME)/lib32 -L$(ORACLE_HOME)/rdbms/lib32 INC=$(ORACLE_INCLUDES) LIB=$(ORACLE_LIBS) -lclntsh -locci #为方便取下面三个变量,目标为helloworld,源文件是helloworld.cpp,编译后文件helloworld.o PRG=helloworld SRC=helloworld.cpp OBJ=helloworld.o #下面是常规的makefile内容,$@表示依次取目标执行,这里只有helloworld一个目标。实际等价于 #CC -o helloworld helloworld.o 不过加入了include和lib文件。而helloworld.o需要后续完成 $(PRG):$(OBJ) @echo "begin link......" CC $(INC) $(LIB) -o $@ $(OBJ) #helloworld目标依赖helloworld.o生成,所以该句就是编译.c生成.o文件。只不过加入了include和lib文件 $(OBJ):$(SRC) @echo "begin compile......" CC $(INC) $(ORACLE_LIBS) -c $(SRC) #后面的内容不是make的内容了,而是make clean内容。比如想重新make之前,清除.o等文件,执行make clean语句 #.PRNOY语句表明 clean关键词是个伪目标。make不自动执行。 .PRONY:clean clean: @echo "Removing linked and compiled files......" rm -f $(OBJ) $(PRG)
写到这里,Makefile写完了,至于是否正确需要实际验证,因为每个人的oracle安装的不一样,所以里面的变量内容需要酌情更改,按照我说的更改即可,验证方法很简单,执行make命令(或绝对路径用make),看是否能够编译.cpp并生成.o及最后的目标文件。一步一步检查看哪里存在问题。问题常常是oracle路径的问题要设置好。其实路径无非是编译需要的和链接需要的include及dll文件而已。所以根据这个思想去你的oracle目录下去找他们吧。 Makefile很关键,没写好的留言讨论。
验证代码如下:
//代码的目的就是验证makefile中oracle的头文件和lib文件路径是否正确了 #include <iostream> #include <occi.h> using namespace std; using namespace oracle::occi; main() { Environment *env=Environment::createEnvironment(); cout<<"success"<<endl; }
注:编译好了,执行一下看是否输出success
第三步另起一篇,第三篇是在c++及makefile环境没问题的情况下如何访问远程oracle数据库了。