64位Redhat系统应用(c++代码)搭建-使用informix和g++编译

时间:2021-11-03 15:34:05

这篇博客很有必要写下来,记录我在一个比较原生的Linux系统上搭建一套应用所遇到的各种问题和各种坑。

关于这套应用,算是我离职前的一个项目,不完成的话没有办法交差,同时,这个项目也比较紧,合作行一直在催,所以我搭建的时候也比较着急,我在Linux搭建应用也没有什么经验,准确地说搭建c++的项目没有经验,c++的项目不像java,java运行在虚拟机上,一次编译,可以在其他机器上运行,但是c++不行,你需要重新编译,一旦重新编译,问题就全来了,原来的代码依赖的一个库文件可能是32位的,现在系统是64位,可能会出错!原来的系统的一些环境在新的系统上没有,那你自然也无法编译成功。反正遇到很多问题,只能上网搜。

1.第一个问题:在informix数据库上建表。

informix数据库按照好了,但是没有我们应用的数据库表,首先你要先建表。我们从网络管理员那里拿来root用户,使用完后会被回收!用root用户创建一个新的用户,专门用来部署应用,名字zntd(智能填单:就是人家银行大厅那种智能平台,有叫号功能,可以先填入人员信息,等排到你时,直接报生成的序号,柜员根据序号可以从柜面直接可以获取你刚刚填的信息,从而节约了时间)。拷贝测试环境的代码到该用户目录下,先dbaccess一把!结果直接提示没有改命令,静下心来一想,估计是环境变量没有设置,对的,立马去测试环境看,env一把!看到关于informix相关的配置信息,然后生产环境env一把,果然,一条informix相关的配置信息都没有,加上去,小心一点,大概有下面几条:

INFORMIXSERVER=cib_dbs
INFORMIXDIR=/usr/informix
ONCONFIG=onconfig.cib
LD_LIBRARY_PATH=/usr/informix/lib:/usr/informix/lib/esql:
TERMCAP=/usr/informix/etc/termcap
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/informix/bin:/usr/informix/bin:/usr/informix/bin

你可以在zntd用户下,输入ls -a,可以看到。bash_profile,在这里面进行逐一添加,类似下面这样:

PATH=$PATH:$HOME/bin

export PATH

INFORMIXSERVER=cib_dbs
export INFORMIXSERVER INFORMIXDIR=/usr/informix
export INFORMIXDIR TERMCAP=$INFORMIXDIR/etc/termcap
export TERMCAP LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH PATH=$INFORMIXDIR/bin:$PATH
export PATH CLIENT_LOCALE=zh_CN.gb
export CLIENT_LOCALE ONCONFIG=onconfig.cib
export ONCONFIG

但上面这个也有一个问题,你在输入env的时候,会发现有的路径重复了,应该是我export的顺序可能有问题,但先不管!

这个时候你dbaccess一把,发现可以进入sql界面了,心里稍微踏实了一些。

好了下面,就要执行建表的sql语句,informix怎么直接运行sql,网上一搜:dbaccess < XXX.sql,如果sql中指定了数据库,如果没有数据库名,就要dbaccess 数据库名 XXX.sql。运行一把,报错,泪流满面啊,为什么又错。打开sql文件一看,第一句话:create database zntd in datadbs;报错提示的是么有schema叫datadbs,schema是什么鬼,自行百度吧,哎,我也不知道。onstat -d可以列出所有的schema。找啊找,终于找到cd /home/IFXDBS/目录,一看,果然没有,有一些其他的schema,所以要创建一个(这个时候要切换到informix用户,想一想,是应该这样,zntd只是一个应用用户),尼玛,竟然要自己创建,这么弱智的嘛,创建完了,不行!你还要分配空间:onspaces -c -d datadbs -p /home/IFXDBS/datadbs -o 0 -s 5000000。这样总行了,当然不行,会出错的,还要chmod 660 datadbs,这个文件就是要660,不然运行出错!为什么不666,汗颜!OK,这下切换到zntd用户再运行dbaccess < XXX.sql,看到输出的日志,没有错误,内心坦然了许多~为了确认一下,可以dbaccess zntd,如果没哟问题,是可以直接进入sql的相关页面。哦,补充说一下这个问题:Unable to load locale categories,这个需要CLIENT_LOCALE=zh_CN.gb,export CLIENT_LOCALE,这个看起来和informix没有什么关系,实则在运行的时候报了这个错误,所以在上面的.bash_profile要加上。OK,数据库表建好了,下一步就是要编译了。

2.第二个问题:make g++编译

确认一下makefile文件,看一下informix相关的路径是否正确,不同的系统,informix的路径是不一样的,有的是/opt/informix,有的是/urf/informix。确认了这些,我要敲make命令,心提到嗓子眼!深呼吸几下,敲下make命令,直接弹出g++命令不存在,尼玛啊!为什么g++都没有,再看测试环境,g++ -v,显示了有!那怎么办,请网络管理员加呗!不巧的是,网管请假了,呵呵。请假,他妈我也找,时间紧迫,微信给他,诶,过了一会他回了,yum g++试试,不行,yum gcc-g++,不行,反正试了N种方法就是不行,奔溃,这还没有编译呢,编译器都没有,还不知道编译会出现什么问题,蓝瘦香菇。网管说,等明天他过来再看吧,只能这样了。第二天,上午当然是没有联系上他,下午继续找,他才回,后来我想了想,可能是版本的问题,gcc的版本是一个16的版本,yum gcc-g++的时候,提示没有相关的资源,后来我看到g++的版本变低了,估计是网管重新安装了旧的版本,这个时候就有与gcc相关的g++版本了,当然这些都是我的猜测,我他妈也懒得去理了,其他同事都忙,你向他们请教问题,都爱理不理,当然人家也没有义务教我。OK,编译器好了,那明天再编译吧。

3.第三个问题:编译时出现的问题

要make了,还是很紧张,下定决心了。意料之中,出错了。error: gnu/stubs-32.h: No such file or directory,上网搜,发现是版本的问题,在64位环境,编译用到32位的库,肯定不行了,我想,既然是64位的,为什么不将FLAG=-g -DLINUX -m32 -D_H_LOCALEDEF中的-m32改为-m64,gcc相关的参数可以参考这篇博客:https://www.cnblogs.com/fengbeihong/p/3641384.html。屏住呼吸,一鼓作气敲下make,行了吗?打印了那么多日志,停留在最后一行,失败二字映入眼帘!再次崩溃!具体错误不大记得了,大概是32位和64位的问题,隐隐约约觉得这条路行不通。还是改回32位,然后用网上推荐的方法,我们需要切换到root用户,然后执行yum -y install glibc-devel.i686。也没有报多大希望,运行一把吧,哐哐哐,一连串日志打印,有点激动,停了下来,是成功了吗?貌似,好像,似乎没有出错,再看生成的可执行文件和so库文件,都是最新的,那应该是编译成功了。哎,长舒一口气,拷贝so文件到bin目录下,启动服务,没有报错,那就是可以了,我有点想笑。

4.第四个问题:测试代码

用java写个程序,往这个服务器发消息吧,三下两除二,发了消息,赶紧看日志,还是报错啊,数据库连接失败,我cnmgb!数据库明明创建好了啊,怎么会连接失败!定位到代码处,报的是-25596        INFORMIXSERVER 值没有列在 sqlhosts 文件中。感觉没有什么问题啊,但是奇怪的是,ec文件连接数据库都用不用user和密码的吗,问了,还真是,好吧,我也没有什么好说的。那到底是什么原因,想了半天,还是去调用这个函数的地方看吧,果然,我发现了问题,预知后事如何,请听下回分解,开一个玩笑,代码如下:

#ifdef _TEST
setenv( "INFORMIXDIR", "/opt/informix", );
#else
setenv( "INFORMIXDIR", "/usr/informix", );
#endif
setenv( "ONCONFIG", "onconfig.cib", );
setenv( "INFORMIXSERVER", "cibsvr", );

直觉告诉我,就是这边的问题,变量没有设置对,一一排查,最终定位到INFORMIXSERVER这个变量,env一下,这个变量不是这个值啊,要改!make clean,再make,正常生成。再替换bin目录下的so文件,再发消息,好像可以了,是的,好像可以了,再去数据库查看,也有数据了。心中的一块石头也终于落地了。关于informix,还是再多说一下,有几个需要确认的地方:

1)/usr/informix/etc下的sqlhosts文件

demo_on onipcshm on_hostname on_servername
cib_dbs onsoctcp dwzntd informix_sr

2)/etc/hosts

163.2.61.100    dwzntd

3)  /etc/services

informix_sr     5559/tcp                #database

上面这三个文件,你要核实一下,没准就是这边的问题。

OK,以上就是遇到的一些问题和坑,避免下次再犯。