java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会
程序的可移植性: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下程序移植体会相关推荐
- 小程序 移植 云开发_使用Kubernetes探索跨云的应用程序可移植性
小程序 移植 云开发 本文与Lindsey Tulloch共同撰写. 在一个快速迁移到云的世界中,投资者,客户和开发人员正在屏息地注视着"云战争". 随着云巨头的崛起以及新型基础架 ...
- java程序的可移植性
1.java作为一种编程语言:源代码可移植性 作为一种编程语言java提供了一种最简单同时也是人们最熟悉的的可移植性--源代码可移植.这就意味着任何一个java程序,不论它运行在何种cpu.操作系统或 ...
- Windows下程序向Linux下移植实践
一.问题的提出 在程序员中有这样一个说法,若一个程序不能移植到Linux下,那这个程序将看不到未来. 由于Linux操作系统源码公开是的,开发库等辅助工具都是源码公开的,这样就减少了程序的不可预知性, ...
- java程序实现可移植性依靠的是_什么是JAVA的可移植性
JAVA的可移植性: 1.JAVA作为一种编程语言:源代码可移植性 作为一种编程语言,JAVA提供了一种最简单同时也是人们最熟悉的可移植性–源代码移植.这意味着任意一个JAVA程序,不论它运行在何种C ...
- java如何调用linux命令_java程序中如何调用linux命令
java程序中如何调用linux命令 作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服 ...
- stricmp linux 头文件,Windows下程序向Linux下移植细节
3.2.程序的移植 进行程序移植的过程中碰到的问题较多,但大都主要集中在文件名大小写.路径分隔符.数据类型等方面. 3.2.1Linux和Windows操作系统API差异 Windows下基于MFC的 ...
- gsoap linux 编译,gSOAP嵌入式linux下的移植与程序开发
一.移植 1.下载源码 本例下载最新版本为:gsoap_2.8.33.zip 2.解压源码 $ unzip gsoap_2.8.33.zip 3.平台准备unbuntu1204 $sudo apt-g ...
- 与Java相关的四十个名字 (2005.08.18 来自:《程序员》杂志)
十大事件 1990-1994:Java缘起 文/孟岩 Larry Wall说,优秀程序员应有的三个特点:懒惰.急躁和傲慢.Java就是诞生在一群懒惰.急躁而傲慢的程序天才之中. 1990年12月,Su ...
- Java云同桌学习系列(十九)——Linux系统
本博客java云同桌学习系列,旨在记录本人学习java的过程,并与大家分享,对于想学习java的同学,我希望这个系列能够鼓励大家一同与我学习java,成为"云同桌". 每月预计保持 ...
最新文章
- 【青少年编程(第33周)】Scratch(三级)公益活动开营了!
- Web 前端,易学难精,没有拿手的实战项目,怎么办?
- HTC与酷派 不是冤家不聚头
- 日期年月日的比较以及判断
- IoT Architecture
- win8.1和wp8.1共用代码,需要注意的一些问题
- 最细致的Spring Boot结合Vue前后端分离项目打包部署步骤(搭配Nginx)
- 【Java】ThreadLocal SimpleDateFormat 静态代码块 空指针异常
- STM32单片机在Keil5下仿真的问题解决及GPIO口初始化、使用
- sparkTransformation算子
- Redis 订阅与发布
- SVN下载安装及使用教程
- 解决Not all parameters were used in the SQL statement问题
- 大数定律和中心极限定理
- html文件默认浏览器改不了,怎么设置默认浏览器 3种更改默认浏览器方法
- msp430流水灯c语言程序,基于MSP-EXP430F5529开发板流水灯程序
- 我来告诉你spyder打不开在哪里看找问题
- oracle数据库恢复aul_ORACLE恢复神器之ODU/AUL/DUL
- TI Sitara AM57x DSP+ARM + Xilinx Artix-7 FPGA核心板 规格书资料
- DAG技术币下一个以太坊? 代码不咋的总量40亿有人收4毛一个了