从Windows向Linux的C和C++代码移植

时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……

从Windows向Linux的C和C++代码移植.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219