移植windows下的VC程序到Linux下的gcc环境

这次要移植的程序是个命令行程序,相对于MFC的程序移植要简单很多。下面是一些常见的问题。

1.数据类型的不一致

VC下面的int64是__int64, gcc下面是int64_t,需要写一个tyepdef来处理,另外就是gcc需要include inttypes.h。

2.一些编译指令的不同

比如inline, vc 是_inline,gcc是 __attribute__((always_inline))

3.内存分配的不同
vc的内存对齐分配的api是_aligned_free,_aligned_malloc
gcc是free,memalign

内存对齐的处理也不一样
#if WIN32
#define ALIGN(x) __declspec(align(x))
#elif LINUX
#define ALIGN(x) __attribute__((aligned (x)))
#endif

4.数据类型的自动转换
vc可以自动将int转换为double,gcc必须强制转换

5.多线程处理
gcc用的是pthread,vc用的是自己的多线程库。

openmp的处理
VC里面在ide可以加入openmp的支持,gcc的编译选项是-fopenmp,引用的库是-lgomp

6.一些常见的字符串函数api不一样
vc上strtok_s,_stricmp, _snprintf
对应的gcc是strtok_r,strcasecmp, snprintf

7.一些常量宏定义不一样
vc _MAX_FNAME _MAX_PATH
gcc NAME_MAX PATH_MAX
另外gcc需要include limits.h

8.c++和c混合编程
不知道为什么vc2010中好像可以自动处理c
gcc中必须给c函数加上
#ifdef __cplusplus
extern "C" {
#endif
...
void xxx;
...
#ifdef __cplusplus
}
#endif

9.编译指令
gcc编译sse指令的时候需要加上-msse4.1的编译选项

10.Linux文件名是大小写敏感的,经常文件找不到的错误是由于文件名大小写引起的。

11.注意某些数据类型的size在vc,gcc下不同,比如unsigned long在vc 64bit的size下面是4,而在gcc 64bit下面是8.

最后,相对来说gcc编译检查更严格一些,很多vc不报错的语句,gcc都会报错。