-
2005-05-30
程序的可移植性: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),这样总会触发断
http://jimsu.yourblog.org/logs/367395.html
随机文章:
Great Adobe and FMS 2008-08-26求opensource的wiki软件 2008-01-13使用GD库来绘jpg,png,gif图 2005-09-20欢迎访问http://63.223.72.218/ 2005-06-01
收藏到:Del.icio.us





