从Windows向Linux的C和C++代码移植
时间:2025-03-09
时间:2025-03-09
window平台向linux平台的代码移植讲解
从Windows向Linux的C/C++代码移植
一 准备移植
1 熟悉linux编程环境
⑴ linux版本:
redhat 系列: redhat (7.2 , 8.0, 9.0, AS *, Fedora Core *)
debian 系列:ubuntu (6.06 , …)
suse 系列: suse (9.0 , …)
turbo linux
红旗linux
…………….
⑵ linux内核:老版本多是kernel2.4或者更早,新版本多是kernel2.6(内核更新主要是提高了系统性能及稳定性)
⑶ 典型linux开发环境:
① Shell命令控制台:bash(最常用,大多讲解shell编程的资料都基于bash),csh,ksh, 。。。
常用命令:
man 查看联机手册(包括命令参数,函数返回值等等)
ps 显示进程状态 (ps -ax)
top 显示实时CPU及内存状态 (shift + p,按CPU状态排序;shift + m,按内存状态排序)
window平台向linux平台的代码移植讲解
ls 列出符合条件的文件或目录 (-R 递归输出; -l 详细输出,ls –l 在部分linux上可简写为ll )
pwd 列出当前路径
cd 切换到某个路径 (cd 切换到用户目录, cd . 切换到当前目录 , cd .. 切换到上一级目录, cd – 切换到上一次操作所在目录) mkdir 创建目录 (rmdir 删除目录)
find 查找符合条件的文件或目录 (例find . –name “*”,其中“.”代表在当前目录下查找,若“/”则代表在根目录下查找) rm 删除文件或目录 (-r 递归,-f 非交互式)
cp 拷贝文件或目录 (-r 递归,-f 非交互式 )
mv 移动文件或目录
cat 显示文本内容 (-A 显示所有内容,包括回车换行制表符等空白字符)
ln 建立链接文件 (例ln –s source dist)
nm 列出目标文件中的符号 (例nm lib***.a | grep)
ldd 列出共享库依赖
awk 按格式分割文本并输出 (例 awk –F : “{print $1}”)
grep 列出符合条件的行 (例 ps –ax | grep sshd ; grep –n –r “pattern” *)
sed 列出符合条件的行或替换行 (sed –n “/123/p” 123.txt ; sed –n “s/123/321/p” 123.txt)
② gcc,g++编译器:gcc可以对c/c++代码进行编译,g++可以对c++代码进行编译,gcc和g++在编译c++代码时,在编译阶段效果是相同的,在链接阶段g++会自动链接上标准c++库libstdc++***.so,而gcc则需要手动加上 -lstdc++。
③ gdb调试器:可对由编译器生成的程序进行调试,如何调试以及常用命令请参见附录3:如何使用gdb进行调试及常用命令。
④ 可选开发工具及编译环境:
Shell脚本,perl脚本,icc编译器(ihmmparam.dsp:source/share/ihmmparam.cpp)
window平台向linux平台的代码移植讲解
2 了解windows与linux的C/C++代码的差异
⑴ 关于路径分割符“/”和“\”:
“\”路径分隔符在linux 上不支持,需要都改为“/”
⑵ 文件名大小写:
Windows下文件名大小写不敏感,而在linux下文件名大小写敏感,代码中需严格遵照文件名大小写,否则编译报错“No Such file or directory”。
⑶ for 作用范围:
Windows下for中变量定义可以应用在所在函数体接下来的部分,而在linux下for中变量定义只应用在for循环体内部, 即在windows下,如下代码编译不报错:
for (int i=0; i<10; i++)
for (i=0; i<100; i++)
而在linux下,如上代码报错,需做如下修改:
int i;
for ( i=0; i<10; i++)
for (i=0; i<100; i++)
⑷ 另外gcc/g++编译中语法判断较VC更严格,早期的gcc2.96相对不很严格,但编译生成程序的性能及优化程度都比高版本(目前最高版本4.*)的要弱,所以建议都按较严格语法来编译代码,
例:在类中声明友类时,
Class
window平台向linux平台的代码移植讲解
{
friend myclass1;
}
在windows下编译没有错,在linux下就会报错,
改为如下编译通过:
Class
{
friend class myclass1;
}
二 着手移植
1 撰写 Makefile并着手编译
参考windows下的dsp文件,来创建对应的Makefile文件。
⑴ 明确Makefile内容:
生成程序文件名,.cpp或.c文件列表及其搜索路径,头文件包含路径,库文件链接路径,编译参数等。例子可参见工程所用的Makefile
⑵ 执行Makefile,开始编译:
make -f ***.makefile (如果Makefile以“makefile”或“Makefile”命名,可不带 –f 参数)
⑶ 查看并分析编译错误:
window平台向linux平台的代码移植讲解
① 提示文件没找到:
首先排除一2(1)(2)两种情况,然后检查Makefile(VPATH , INC_***_PATH),看文件路径是否可搜索到,如果是windows
下的头文件,可采用条件编译 ifdef WIN32 方式注释掉,或者在可搜索路径下生成一个同名空文件替代。
② for循环中变量定义报错:
采用前述 一2(3)的方法解决。
③ 出现无定义的windows系统函数:
这种情况大多可以找到一个linux下相对应的函数,例如 _access -> access , stricmp -> strcasecmp ,(在linux下查看系统
函数手册,使用 man ,有时需要加参数2或3以避免和命令混淆,例 man 2 mkdir ;查找系统函数,使用 man –k keyword;还找不到的话,或者确实没有对应函数,或者还是用google搜吧),如果找不到对应的函数的话,一种办法就是将几个函数组合实现其对应功能,另一 …… 此处隐藏:8529字,全部文档内容请下载后查看。喜欢就下载吧 ……