几次windows代码迁移到linux纪实

迁移方法

一般windows代码为MFC 开发的 ,第一次被要求迁移到QT 便尝试将代码迁移到QT 并迁移至linux (一次是麒麟一次是ubuntu)
1为了保留原来的结构,先将能用QT 写的用QT 写如QFile ,QString,QThread, TCP UDP 等操作要求不高的可以用QSocket 总之可以用QT 都全换了,把一些c语言的形式,封装成C++类的 形式。 其他的也尽量用 C++ 的stl 。工作量大。
2 后来不想全改QT ,
如果不同函数名功能类似 头文件
#ifdef __unix 写入linux 下的头文件,
将调用的函数名define为windows下的文件名 注意参数对对号入座。这样保留了原来代码。

#ifdef __unix

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define _mkdir(path)    mkdir(path,0)
#define _access(pathname,mode)    access(pathname,mode)
#define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename),  (mode)))==NULL
#define CreateFile(pFile,filename,mode) ((*(pFile))=fopen((filename),  (mode)))==NULL

#endif

有的实现函数不同 代码也差异比较多在代码实现处
用了#ifdef _WIN32 #else #endif

#ifdef _WIN32
	hd = CreateFile(pStrPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE == hd)
	{
		return LOG_FAILED;
	}
	if (DWORD_NULL == SetFilePointer(hd, iPos, NULL, FILE_BEGIN))
	{
		return LOG_FAILED;
	}
	iRet = SetEndOfFile(hd);
	CloseHandle(hd);
#else
    mode_t perms = S_IRWXU; // Pick appropriate permissions for the new file.
    int fd = open("file", O_CREAT|O_EXCL, perms);
    if (fd >= 0) {
        // File successfully created.
    } else {
        // Error occurred. Examine errno to find the reason.
    }
#endif

注意事项

#pragma once 尽量删除 不是所有编译器保证适用。不能保证跨平台。不过貌似影响不大 因为很多编译器都支持了。

好多没有定义的类型自定义

#ifndef VOID
typedef void VOID;
#endif
#ifndef SOCKET
typedef int SOCKET;
#endif
#ifndef HANDLE
typedef void * HANDLE;
#endif
#ifndef TCHAR
typedef char TCHAR;
#endif
#ifndef sockaddr
typedef struct sockaddr sockaddr;
#endif

windows是unicode编码 linux uft-8
QT 编码不对时提示 Error could not decode xxx 可以将程序文本用txt打开’另存为‘更改其编码。
一些为定义的类型如LPCSTR,LPSTR自定义。

#ifndef LPCSTR
typedef const char* LPCSTR;
#endif
#ifndef LPSTR
typedef char* LPSTR;
#endif
#ifndef LPTSTR
typedef char* LPTSTR;//LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义
#endif

针对linux 还有windows 的api不能用的 ,具体问题具体分析。

如windows的注册表
linux 下没有。具体功能具体实现

windows的Service服务程序开发
linux 是systemctl命令

Logo

更多推荐