程序的可移植性:window,linux,aix,solaris下程序移植体会

- [工作学习]

1.类型

我们知道,在Windows平台中,系统定义了很多诸如BOOL,CHAR,ULONG,HANDLE等大写命名的类型,而在unix等系统中却没有。实际上,为了做好源代码在各个系统下的移植,我们要使用这些类型,必须在unix中对这些类型进行定义。

一般我们采用typedef来进行定义,比如:typedef char

CHAR;但是为了防止多处重复定义导致的不一致,建议每个类型做如下形式的定义:

#ifndef BOOL_T #define BOOL_T typedef char BOOL; #endif

类似的定义包括各种类型:LONG,ULONG,INT,UINT,INT32,UINT32,HANDLE,PVOID,DWORD,HMODULE等;

枚举值与Macro:TRUE,FALSE,NULL,INFINITE,WAIT_OBJECT_0,WAIT_TIMEOUT等。

2.多线程

在Windows中,存在大量关于thread的API,既有c运行库,也有win32

api库函数,同样Linux/Unix也同样支持thread,只是它们的API有些区别,在编写代码的过程中,需要区分对待。线程处理回调函数申明:

Windows平台: DWORD WINAPI ThreadProc(LPVOID lpParameter);

Linux/Unix平台: void * start_routine(void * pParam);

pthread:大部分Linux/Unix平台都支持posix

pthread库,Redhat Linux,IBM AIX,Sun

Solaris都是支持的。它们的函数定义都是相同的,这一点可以做到很好的移植性,只要移植其中一个,其他平台就不用做大的修改。注意:下面举的Windows下的例子都是采用的Win32

thread API,而不是c运行库函数。线程创建和结束:

Win32:CreateThread Linux:pthread_create

在多线程程序中,同步和互斥是相当重要的,它们保证了数据操作的一致性。

CreateEvent pthread_mutex_init,sem_init SetEvent

pthread_mutex_unlock,sem_post WaitForSingleObject

pthread_mutex_lock,sem_wait,pthread_join CloseHandle

pthread_mutex_destroy,sem_destroy

备注:AIX对sem_init等还不支持,系统没有实现这些函数。(本人版本AIX5.2)

3.连接库至于什么是连接库,我不想多说。只说明一点,连接库包括静态连接库和动态连接库。静态库在Windows和Linux/Unix下分别表现为.lib和.a。动态库在Windows和Linux/Unix下分别表现为.dll和.so。

静态库:lib与a

Windows下直接在VC6选择静态库开发即可。

Linux/Unix下开发与普通程序相同,只是不需要main文件,编译结束后采用ar命令将所有.o文件打包成一个.a文件。使用它们的时候只需要将静态库连接进去即可。

动态库:dll与so

动态库的特点:

1.Windows下为dll,Linux/Unix下为共享库so。

2.减少空间,动态加载。

3.每个进程都有自己的image,进程间的dll/so不干扰。

入口函数定义: Windows

Dll都有一个dll加载开始执行的入口,这是必须的,但是linux/unix却不必要。

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,

LPVOID lpReserved ) 导出函数的申明: Windows平台:

extern "C" __declspec(dllexport) BOOL fnAgentStart(PRUNNING_PARAMS

pRunParams); Linux/Unix平台: extern "C" BOOL

fnAgentStart(PRUNNING_PARAMS pRunParams);

因为Windows下大都使用C++编写程序,为了加载过程找到函数名字,必须使用extern

"C",否则C++编译器会自动加上一些前缀标签。在Linux/Unix平台下,可以去掉__declspec(dllexport)修饰,它是Windows下对导出函数的修饰。

动态库相关API: LoadLibrary dlopen GetProcAddress dlsym

FreeLibrary dlclose 动态库中共享全局变量:

Linux,Solaris都不需要特殊的修饰符,但是AIX不行。

aix:? 共享库的编译: Linux: gcc -fPIC -c a.c;ld -shared

-soname liba.so -o liba.so a.o AIX/Solaris: cc -c a.c; cc -G -o

liba.so a.o

4.硬件相关 #pragma #pack intel x86与Risc,sparc

5.Service与daemon

6.系统信息: Windows: API; Qnix:/proc;

API区别:sleep,Sleep等。

7.编译 C:gcc,cc,/usr/ccs/bin/cc,(solaris forte C); C++:gcc,cc,CC;

Lib:-ldl -lpthread

备注:solaris中如果调用了recvfrom等socket处理函数,编译连接时必须加-lxnet参数。

Makefile:

Linux,AIX,Solaris都支持Makefile,而且AIX,solaris的Makefile能通用,Linux下的make支持更多,更友好。

8.多用#ifdef #if defined

注释采用方式,不要采用//,因为有些编译器不支持//的。

开发工具:vi,觉得linux做得最友好,编译速度也最快。

9.调试对于编写软件来说,工作量并不只是去编写代码,更多的精力可能放在调试和查错上面。在各个平台上的调试技术有些差别。具体细节这里不详述,主要补充几个平台下的区别。

Windows:有个非常出色的编辑器和调试器,vc功能非常强大,但读于dll,multithread程序就稍微有些麻烦,甚至断点都不好设置,对于一些不好设置断点的地方,可以在DEBUG模式下在被调试代码前插入assert(0),这样总会触发断

java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会相关推荐

  1. 小程序 移植 云开发_使用Kubernetes探索跨云的应用程序可移植性

    小程序 移植 云开发 本文与Lindsey Tulloch共同撰写. 在一个快速迁移到云的世界中,投资者,客户和开发人员正在屏息地注视着"云战争". 随着云巨头的崛起以及新型基础架 ...

  2. java程序的可移植性

    1.java作为一种编程语言:源代码可移植性 作为一种编程语言java提供了一种最简单同时也是人们最熟悉的的可移植性--源代码可移植.这就意味着任何一个java程序,不论它运行在何种cpu.操作系统或 ...

  3. Windows下程序向Linux下移植实践

    一.问题的提出 在程序员中有这样一个说法,若一个程序不能移植到Linux下,那这个程序将看不到未来. 由于Linux操作系统源码公开是的,开发库等辅助工具都是源码公开的,这样就减少了程序的不可预知性, ...

  4. java程序实现可移植性依靠的是_什么是JAVA的可移植性

    JAVA的可移植性: 1.JAVA作为一种编程语言:源代码可移植性 作为一种编程语言,JAVA提供了一种最简单同时也是人们最熟悉的可移植性–源代码移植.这意味着任意一个JAVA程序,不论它运行在何种C ...

  5. java如何调用linux命令_java程序中如何调用linux命令

    java程序中如何调用linux命令 作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服 ...

  6. stricmp linux 头文件,Windows下程序向Linux下移植细节

    3.2.程序的移植 进行程序移植的过程中碰到的问题较多,但大都主要集中在文件名大小写.路径分隔符.数据类型等方面. 3.2.1Linux和Windows操作系统API差异 Windows下基于MFC的 ...

  7. gsoap linux 编译,gSOAP嵌入式linux下的移植与程序开发

    一.移植 1.下载源码 本例下载最新版本为:gsoap_2.8.33.zip 2.解压源码 $ unzip gsoap_2.8.33.zip 3.平台准备unbuntu1204 $sudo apt-g ...

  8. 与Java相关的四十个名字 (2005.08.18 来自:《程序员》杂志)

    十大事件 1990-1994:Java缘起 文/孟岩 Larry Wall说,优秀程序员应有的三个特点:懒惰.急躁和傲慢.Java就是诞生在一群懒惰.急躁而傲慢的程序天才之中. 1990年12月,Su ...

  9. Java云同桌学习系列(十九)——Linux系统

    本博客java云同桌学习系列,旨在记录本人学习java的过程,并与大家分享,对于想学习java的同学,我希望这个系列能够鼓励大家一同与我学习java,成为"云同桌". 每月预计保持 ...

最新文章

  1. 【青少年编程(第33周)】Scratch(三级)公益活动开营了!
  2. Web 前端,易学难精,没有拿手的实战项目,怎么办?
  3. HTC与酷派 不是冤家不聚头
  4. 日期年月日的比较以及判断
  5. IoT Architecture
  6. win8.1和wp8.1共用代码,需要注意的一些问题
  7. 最细致的Spring Boot结合Vue前后端分离项目打包部署步骤(搭配Nginx)
  8. 【Java】ThreadLocal SimpleDateFormat 静态代码块 空指针异常
  9. STM32单片机在Keil5下仿真的问题解决及GPIO口初始化、使用
  10. sparkTransformation算子
  11. Redis 订阅与发布
  12. SVN下载安装及使用教程
  13. 解决Not all parameters were used in the SQL statement问题
  14. 大数定律和中心极限定理
  15. html文件默认浏览器改不了,怎么设置默认浏览器 3种更改默认浏览器方法
  16. msp430流水灯c语言程序,基于MSP-EXP430F5529开发板流水灯程序
  17. 我来告诉你spyder打不开在哪里看找问题
  18. oracle数据库恢复aul_ORACLE恢复神器之ODU/AUL/DUL
  19. TI Sitara AM57x DSP+ARM + Xilinx Artix-7 FPGA核心板 规格书资料
  20. DAG技术币下一个以太坊? 代码不咋的总量40亿有人收4毛一个了

热门文章

  1. 图像分割 | 训练集输入labe(mask)处理以及类别不均衡的处理-以segnet为例
  2. Jvisualvm--JAVA性能分析工具
  3. 计蒜客NOIP模拟D1T2
  4. (转)SpringMVC学习(一)——SpringMVC介绍与入门
  5. 《机器学习与R语言(原书第2版)》一2.3 探索和理解数据
  6. 解决linux下无线网卡被物理禁用问题
  7. C++宏定义中#与##的妙用
  8. windows mongdb 安装
  9. Android应用程序组件Content Provider简要介绍和学习计划
  10. 释放Linux磁盘空间方法