将win32代码(windows.h)移植到linux

时间:2012-02-17 22:23:04

标签: c++ windows linux winapi porting

我正在开发一个c ++项目,我有一堆Visual Studio生成的项目文件,我想将它移植到linux。我基本上在Windows上的多个文件中使用windows.h头文件。现在,我不确定是否明确存在没有linux.h文件(如果它确实存在,请指导我在哪里查看)。在linux上我使用Eclipse CDT进行开发。我有两个想法,它可能会在linux上运行,但我希望你的输入知道正确的方向是什么:

(1)使用C ++文件中的Linux API调用删除Windows API调用。但这意味着,我要在linux中找到相同的功能,我不知道在哪里看。例如。 Win32中的文件时间等同于linux中的内容(尚未找到此内容)。

(2)我复制了这些函数的基本语法(如在windows.h中编写的),只创建一个头文件(假设我将其命名为linux.h)并将此头文件包含在linux上的项目中。

所以,显然你可能已经发现我对如何推动事情感到困惑。我只是想解决这个问题。请建议我以下的想法/观点: (1)不,我不想使用Boost。 (2)我不想在Visual Studio中重写文件。

3 个答案:

答案 0 :(得分:4)

Linux实现了POSIX API。如果你按照路径(1),你需要从这里找到替换标题和电话。

或者,您可以使用Winelib尝试在Linux上“本机”编译Windows代码。 Wine Project实现了大部分Windows API,因此它可以工作,理论上可以重新编译Windows程序以在Linux for ARM上运行,但是他们不保证这一点。

但是,如果您想要遵循第二条路径,则需要为用户可能已安装的每个Wine版本重新编译,因此如果它们位于x86上,那么为它们提供二进制文件更有意义以及配置为已知可以工作的状态的custom wine prefix

第三种方法是放弃所有这些,并使用像Qt这样的工具包重写,它将跨Windows / Mac / Linux进行交叉编译,并直接调用底层操作系统。如果您发现代码经常需要在不同的操作系统上工作,那么这可能是最好的选择。

答案 1 :(得分:4)

听起来你想在Linux上使用Windows API。我认为你还应该考虑通过用STL和Boost等可移植库替换Windows API调用来使你的C ++代码可移植。

但是,如果你真的不能这样做,那么请研究WineHQ,它是Linux上Windows API的一种实现。

答案 2 :(得分:1)

这实际上取决于您的申请。如果它只是一个非gui app命令行。您应该考虑使用与不同平台(Linux,Mac OS X)兼容的函数的posix版本替换您的win32调用。

这就是选项1.您可以将Filetime转换为posix here并使用您自己的函数包装它,该函数对于您要编译的每个操作系统都有#ifdef。

选项2是一种痛苦,就是这样做的。但它仍然是一个选项,它实际上取决于源代码中有多少Win32函数以及它们与posix版本的不同之处。我不推荐这个选项。

一旦你学习了win32函数的posix版本并且尽可能地停止使用win32函数,选项1会更好。