64位Redhat系统应用(c++代码)搭建-使用informix和g++编译
这篇博客很有必要写下来,记录我在一个比较原生的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,以上就是遇到的一些问题和坑,避免下次再犯。
64位Redhat系统应用(c++代码)搭建-使用informix和g++编译的更多相关文章
- MiniCRT 64位 linux 系统移植记录:64位gcc的几点注意
32位未修改源码与修改版的代码下载: git clone git@github.com:youzhonghui/MiniCRT.git MiniCRT 64位 linux 系统移植记录 MiniCRT ...
- 64位Ubuntu系统下ROP攻击
64位Ubuntu系统下ROP攻击 基础知识 ROP攻击 ROP全称为Retrun-oriented Programmming(面向返回的编程)是一种新型的基于代码复用技术的攻击,攻击者从已有的库或可 ...
- win10 64位专业版系统中显示32位dcom组件配置的方法
word.excel是32位的组件,当用户64位系统在运行窗口中输入dcomcnfg命令时,在打开的组件服务管理窗口,是找不到Microsoft Excel.word程序的.另外,Windows 环境 ...
- 64位Win7系统下vs2010调试无法连接oracle
64位win7系统的Program Files (x86)路径中有括号,oracle不认识这样的路径,所以就出现不能连接数据库的问题.所以我们可以将vs2010的内部调试web服务器WebDev.We ...
- 64位Win8系统下安装Oracle12c
经过3个小时的折腾,终于在64位win8系统下成功安装了Oracle 12c.这篇文章主要把安装过程中遇到的一些问题总结一下,以便帮助后来人参考. 首先我把我的机器的主要配制情况列举出来: 1. 系统 ...
- 在64位Ubuntu系统上安装32位程序包
在64位Ubuntu系统上安装32位的程序包 $sudo apt-get install package_name:i386 例如: $sudo apt-get install openjdk-7-j ...
- 64位Win7系统nbtstat 问题
64位Win7系统nbtstat 问题 姜糖水 2015-02-02 195 阅读http://ju.outofmemory.cn/entry/114353 在32位系统写:"cmd / ...
- 64位Win7系统下vs2010调试无法连接oracle解决办法
具体的解决办法如下: 1.先将WebDev.WebServer20.EXE和WebDev.WebServer40.EXE文件从Program Files (x86)目录中拷贝出来放到c:\dev目录中 ...
- 解决Tomcat6解压版在64位windows系统上无法启动服务的问题
解决Tomcat6解压版在64位windows系统上无法启动服务的问题 由于客户环境为64位windows系统,开发环境一直用32位.tomcat使用6.0.20非安装版.部署时发现在 ...
随机推荐
- linux 6.5上创建新用户后,不能登陆?
linux 6.5上创建新用户后,不能登陆? 使用root账户登陆却可以! [root@ log]# useradd mtdk[root@ log]# echo 123abc |passwd --st ...
- cookie.js插件
/*! cookiejs v1.0.23 | MIT (c) 2018 kenny wong | https://github.com/jaywcjlove/cookie.js */!function ...
- 第25课 可变参数模板(6)_function_traits和ScopeGuard的实现
1. function_traits (1)function_traits的作用:获取函数的实际类型.返回值类型.参数个数和具体类型等.它能获取所有函数语义类型信息.可以获取普通函数.函数指针.std ...
- Idea中运行项目时出现:未结束的字符串解决方案
一般出现这种情况是编码不一致导致 解决办法: settings>file Encodings 编码设置成一致
- 在Docker环境下部署Kafka
参考:https://blog.csdn.net/u011537073/article/details/70767064
- Rhythmk 一步一步学 JAVA(6): JSP 语法学习笔记
1.修改JSP页面模版: 找到MyEclips安装目录,搜索“Jsp.vtl”,找到该文件修改编码,以及一些不需要用到的代码. 2.查找项目生成的Servlet文件路径: 查看当前项目父级目录搜索 . ...
- git自定义项目钩子和全局钩子
钩子介绍 自定义钩子分为:项目钩子和全局钩子 自定义全局钩子: 全局钩子目录结构: (注意:excludes目录结构是我们自定义的目录,规则逻辑在update.d/update.py脚本里实现的,非g ...
- python_06 函数、全局变量与局部变量、函数递归
函数 1.函数的定义: def 函数名(参数): #解释函数的功能 代码块 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行 ...
- 关于spfa
关于spfa的一些事宜.... 刚开始学的时候只会跑最短路,代码都是背下来的.以下是背的代码... inline void spfa(int s) { queue<int>q;q.push ...
- 常用的stm32库函数
//初始化的方式:先定义初始化机构体.再打开时钟使能.在对每一组GPIO口进行初始化. GPIO_InitTypeDef LED_GPIO; RCC_APB2PeriphClockCmd(RCC_AP ...