LINUX移植中常见的问题及解决的方法.ppt

上传人:爱问知识人 文档编号:5019672 上传时间:2020-01-29 格式:PPT 页数:28 大小:377.50KB
返回 下载 相关 举报
LINUX移植中常见的问题及解决的方法.ppt_第1页
第1页 / 共28页
LINUX移植中常见的问题及解决的方法.ppt_第2页
第2页 / 共28页
LINUX移植中常见的问题及解决的方法.ppt_第3页
第3页 / 共28页
LINUX移植中常见的问题及解决的方法.ppt_第4页
第4页 / 共28页
LINUX移植中常见的问题及解决的方法.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《LINUX移植中常见的问题及解决的方法.ppt》由会员分享,可在线阅读,更多相关《LINUX移植中常见的问题及解决的方法.ppt(28页珍藏版)》请在三一文库上搜索。

1、C程序在LINUX移植中常见 问题及解决方法,银博科技,公司简介,西安银博科技发展公司成立于1992年,属国有高新技术企业,位于西安市高新技术产业区高新路42号金融大厦16层。1993年被西安市科学技术委员会认定为“高新技术企业”,每年都被评为西安市高新技术企业百强企业。 公司主要从事:计算机软件产品开发,系统集成,网络建设,银行业务信息系统的开发建设及解决方案,开发建设现代医院管理信息系统,研制生产网络信息安全产品,设计安装重要场所的防盗报警和电视监控系统,提供计算机及外部设备的维修和长期保修服务等。,编译器的改变,C程序编译器由unix的cc改换为gcc gcc全称 :GNU projec

2、t C and C+ compiler 集中了c、c+ 、Objective C 三个编译版本,可以编译 用这三语言编写的源代码。 gcc的版本 gcc v gcc的安装位置 /usr/lib/gcc-lib/target/version/ /usr/lib/gcc-lib/i386-cosix-linux/3.2/,gdb调试器,gdb - The GNU Debugger gdb的主要功能 运行程序,设置所有能影响程序运行的选项 保证程序在制定的条件下停止 在程序停止时,可以检查变量的赋值 修改程序,继续调试 gdb的启动方式 gdb program:指定要调试的程序 gdb progra

3、m core:指定要调试的程序及其coredump文件 gdb program pid:指定要调试的程序及目前正在执行的进程id号,gdb调试器,退出gdb 使用quit Ctrl+D Ctrl+C 结束任何一个gdb的命令,返回gdb的输入模式 gdb的帮助 help或h 得到gdb命令类的列表 Help status 得到一个status类的列表 Help command 详细的列出单个命令的资料 Info 显示程序的状态 Show 显示gdb自身的状态 Show version :显示gdb的版本号 Show copying:显示 版权信息 Show warranty :显示担保信息,G

4、CC命令行选项,基本 gdb命令 file 装入想要调试的可执行文件 kil 终止正在调试的程序 list 列出产生执行文件的源代码的一部分 next 执行一行源代码但不进入函数内部 step 执行一行源代码但进入函数内部 run 执行当前被调用的程序 quit 终止gdb watch 监视一个变量的值 break 在代码里设置断点,这使程序执行到这里被挂起 make 能不退出gdb就可以重新产生可执行文件 shell 不必离开gdb就能执行shell命令,LINUX移植中常见的问题,缺少程序相应的系统头文件 系统调用中动态链接库的改变 两个系统中函数的差别 程序环境变量的缺失 两个系统中文件

5、目录文件格式的差别 两个系统中编译器之间的差别 两个系统在Informix数据库开发中的差别 两个系统中命令及其参数的差别,缺少程序相应的系统头文件,找不到hbjm.h文件 原因:在/usr/include目录下找不到hbjm.h文件 解决:从原unix机/usr/include目录下找到此文件到linux机上,动态链接库的改变,高版本的开发库glibc-devel-2.2.90-24中,没有提供libsocket.a库 解决:增加libortcp的链接 将crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtenS.o 拷入当前编译目录,两个系统中函数

6、的差别,生成临时文件名失败。 Linux系统下,对mktemp()函数需替换为mkstemp(),用法不同 在linux下,高版本的开发库已经对tempnam函数不在支持。系统建议使用mkstemp()函数来替代。,两个系统中函数的差别,修改例程如下: func() char strFileName50; /strcpy(strFileName, “/tmp/file_XXX”); strcpy(strFileName, “/tmp/file_XXXXXX”); /注意XXX改为XXXXXX /mktemp(strFileName); mkstemp(strFileName); ,两个系统中函

7、数的差别,由于Linux高版本库向国际化标准靠近,对一些旧的函数不在支持.需要将c语言中普通函数gets替换成宽字符处理函数fgetws. 解决:更改生成库libhbjm.a中的文件I_chr.c 第79行中的函数gets()为fgetws() /gets( cmd ); fgetws( cmd );,程序环境变量的缺失,在初始化网点initnode,这个程序的编译时,连接的是informix的动态库,libifsql.so在/home/Informix/lib/esql目录下,环境变量中没有此路径设置。 解决:在环境变量LD_LIBRARY_PATH的变量中增加/home/informix/

8、lib/esql,两个系统中文件目录文件格式的差别,文件目录的差别 在UNIX系统中默认目录为/usr/sam,LINUX系统默认目录为/home/sam 解决:将原来所有/usr/sam路径改为/home/sam,两个系统中文件目录文件格式的差别,文件格式的差别 拷贝文件到软盘上的数据,在打卡机上读数据时报错 解决:在拷贝软盘之前,对文件格式进行转换:将linux格式转换成dos格式 unix2dos filename dos2unix filename,两个系统中编译器之间的差别,函数调用前未声明 gcc编译器要求所有函数在调用前,必须定义或声明函数。 解决:在cash0703.ec前定义

9、函数 static int Print_Page(int iPage); static int Print_AllPage(int flag); static int Get_NodeName(char *cNode,char strNodename);,两个系统中编译器之间的差别,makefile文件中头文件引用方式的不兼容 解决:在/home/sam/scr/kjyw/makefile文件中原代码: esql -DPORT_COM=0 XDEBUG=”log/kjyw/log” c kjyw.ec I/usr/include/xpc_api.h 更改后: esql -DPORT_COM=0

10、 XDEBUG=”log/kjyw/log” c kjyw.ec 在kjyw.ec程序中定义#include ,两个系统中编译器之间的差别,Linux下对char和char*的变量定义要求更严格。函数对将char的字符数组做为返回值时,出现warning 对返回字符串地址的函数进行修改,方法如下。 修改例程如下:,两个系统中编译器之间的差别,/*将程序中的数组变量改定义为指针变量*/ func() /char strTmp30; char *strTmp; strTmp=(char *)malloc(30); return strTmp; ,两个系统中编译器之间的差别,指针数组定义方式 解决:

11、/home/sam/scr/kwh/dj.ec 程序中13行定义为: static char *djstr = “解冻“ , “冻结“ , “ ; 更改后: static char *djstr = “解冻“ ,“冻结“ ,“ ,两个系统在Informix数据库开发中的差别,Informix se 7.22 for linux 的语法要求和Informix se for sco-unix的差异性。Informix se 7.22 for linux中,要求打开一个修改游标时,必须在事务中。 informix数据库中如果没有isql文件时可以改用dbaccess。,两个系统在Informix数据

12、库开发中的差别,/*打开游标必须在事务中*/ func() $char strCola $begin work; $declare update_cur cursor for select col_1 into $strCola from table_1 for update; $open update_cur; $close update_cur; $commit work; ,两个系统中命令及其参数的差别,Shell 的差别 Unix系统中常用的sh、ksh、csh Linux系统中常用bash compress不支持-H参数,改用-f 没有doscp命令,用mcopy命令替代,添加需要的

13、参数 tar 命令 -z支持.gz压缩格式 -P绝对路径的压缩和解压 ls 命令,没有l和lf命令 ls l和unix 系统中的 l相近 ls -F和unix 系统中的 lf相近 rm -f和unix 系统中的 rm相近,其他问题,使用system调用时,父进程对终端的控制影响到子进程对终端的控制 解决:在system调用前,保存父进程对终端的控制参数,恢复原终端的控制参数,调用完成后,恢复父进程对终端的控制参数。 增加runprgram(char *cmd)函数取代system(char *cmd),其他问题,函数引用出错 解决:原系统定义为clear,和系统命令有冲突,改为clear_sc, 替换/home/sam/scr/xtwh/menu.ec中 clear后程序编译通过。,其他问题,NULL问题 函数Add_record 返回需要一个整形值。而返回为NULL, static int Add_record(C_CASHINFO *head, DB_FPART db_Cfpart) return NULL; 在stddeef.h中定义NULL为空指针型 #define NULL (void *)0) 解决:更改第60行返回值为0; return 0;,其他问题,程序运行的权限问题 其他属组没有读或写的权限 函数传递的参数类型不相匹配等问题,谢 谢!,欢迎大家参加交流,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1