unix 2 windows 的C++程序移植的一些常见问题
unix下的编译器我已经记不清楚了, 总之因为原来的程序是用makefile的形式编译的, 虽然VC也支持makefile的形式, 但是无论如何在给原来的unix的编译器用的
makefile文件是不可能直接给VC的编译器用, 而想去了解 makefile 文件的语法和如何实现相当的功能是一件吃力不讨好的事。所以我最后在VC下用了Win32 Console 程序的形式 来完成程序的移植工作, 当然用其它的形式如 MFC AppWized ...也是可以的, 反正对于每个程序员而言掌握方法以后,爱出什么招都无所谓。
常见问题1:
1 文件扩展名, 很奇怪? 大多数的编译器对.cpp 和 .c 文件的处理是不一样的,
但是也有例外时候, 所以有时你要把.c 的改成 .cpp来用。
2 #include "stdAfx.h" 加到 .cpp 文件的前面, 当然不加也可以, 你只要在
工程设置的地方说明一下该cpp文件, not using precompiled headers 或
Automatic use of precompiled headers;
3 模板类的应用, 一般模板类的实现代码需要写到.h 文件中,或在.h中include
.cpp 但这样对程序员来说会觉得很不舒服, 用 makefile 的方式可以解决这个
问题, 但是在VC下又不用makefile,就只有用以上的方法来修改改那些模板类
的代码了,顺便提一下用g++的编译器我也是觉得用在.h中include .cpp 的方法
好一些。
4 数据类型的冲突, 重定义, 在国外的大公司在写程序时一般都有这样的习惯: 定义
自己的数据类型, 如定 INT, DOUBLE, BOOL 等之类的数据类型,然后把这些定义放在 BaseType.h 之类的文件中, 然后在编程时都是用自己定义的数据来完成,我认为这是一个很好的习惯, 因为你很难预料你写的程序会在不同的平台上跑(16位机, 32位机, 64位机...),用不同的编译器,这样做增强了程序的适应性, 当然有时候这也会引起麻烦, 如BOOL不就是在VC中有定义吗?这类问题在知道问题所在以后就很容易解决了。
5 变量初始化, 如这样的代码 int* pInt(NULL), 要改为 int* pInt = (NULL);
等如此类的修改。
6 还有一种常见问题就是link过程中找不到定义或定位不到具体的实现代码之类的或重义的情况, 这样情况解决就看具体的原因了, 很没有什么一劳永逸的方法。
7 与特定的系统或其它的支持环境相关的方法调用, 这类问题的解决与移植程序要达到什么的目标有很大的关系, 有时可能很容易的解决了, 有时又很难解决。比如有关X11也就是关于 X Window的图形系统的,有一定的情况下可以用把X11库拷过来, 做一下compile 可以但是要做到 link 成功, 就不容易反正在VC下我是没有成功的把含x11应用程序link完成。
以上是我在以前的做移植的工作常见的一些问题, 对于前六种情况的处理非常容易,不花多少时间就可以处理完了,这种问题都是第一次处理的时候需要花些时间,以后碰到都是照旧的方法办就可以,第7种情况就有时就较难处理一些。 因为间隔时间较长可能还有一些内容已经忘了,另外可能还有更好的处理方法我不知道, 有什么不对的地方还希望大家多多指正。
梁 2001/05/15