使用C++创建跨平台程序

Creating a Cross Platform Program Using C++

本文关键字:程序 跨平台 创建 C++ 使用      更新时间:2023-10-16

假设我在MSVC++2010中有一个简单的项目。里面只有main.cpp,它的代码很简单,就像这样:

// include macros
#define WIN32
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/fl_ask.H>
// main function
int main()
{
// init window
Fl_Window *window = new Fl_Window(250, 250, "Derp Window"); 
// show window, run window
window->show();
int result = Fl::run();
fl_message("Goodbye...");
// release pointers
delete window;
// return
return result;
}

制作一个与Windows兼容的版本很容易,我所要做的就是设置发布模式并构建它。但是,正如我最近发现的那样,生成的.exe文件在Mac或Linux操作系统上不起作用。这让我很惊讶,因为我所使用的只是普通的老c++和FLTK,它是跨平台的。

所以,我的问题是,我该如何处理这些代码,并以一种在Linux操作系统和Mac操作系统上运行的方式对其进行编译?或者,是否有可能保留相同的代码并以不同的方式编译,使其在另一个操作系统上工作?如果不可能,我需要改变什么?

PS。代码非常直接,但如果你想知道#define WIN32是否存在,因为如果没有它,编译器会担心缺少头文件,比如"X/X11.h">

代码是兼容的,但这并不意味着生成的二进制文件会兼容。总的来说,这是永远不会的情况。

编译器将您的代码转换为特定体系结构和平台能够理解的较低级别代码,而Windows与Mac不同。这个较低级别的代码基本上与C++、FLTK或它们的兼容性承诺无关。

这里的类比是,从机械上讲,在道路的左手边驾驶汽车与在道路的右手边驾驶汽车是一样的(所以我们忽略导航差异和你可能转向不同方向的事实),所以你对如何驾驶汽车的了解完全符合这两种情况…但这并不意味着在法国或美国,你可以简单地把车停在道路的左手边。你会造成一场相当严重的事故。当你把你的驾驶知识应用到特定的环境中时,你必须适应当地的道路规则。

您可以在目标环境下重新编译相同的代码,也可以使用交叉编译器。

如果你无法访问Linux或Mac OSX计算机,你必须对其进行交叉编译。要做到这一点,你必须找到一个现有的交叉编译器,你可以下载源代码,例如GCC,然后自己构建。从"交叉编译器"(或类似的)中进行一些搜索,你会发现一些易于遵循的教程。

如果确实可以访问Linux或Mac,那么只需复制代码并在该环境中构建即可。使用Linux到要小心,因为不同的发行版有不同版本的某些库。

最后,还有像Wine这样的环境,它将允许Windows程序在其他平台上运行。

如果您使用FLTK,您需要在编译程序的每个平台上都包含它的头,而不仅仅是WIN32。

您收到的关于找不到X11/X.h的错误消息可能是由于缺少编译器标志(请参见1)、需要首先包含的先决条件(请参见2。

  1. 使用fltk-config --cflags获取所需的编译器标志,fltk-config --libs获取需要传递给链接器的标志
  2. 这里似乎不适用,但您可能会遇到需要它的库
  3. 如果您使用Ubuntu或Debian,请通过执行apt-get install x11proto-core-dev来安装X标头,但如果您已经安装了libfltk1.3-dev(或其他版本),则不需要这样做,因为它应该引入所有所需的依赖项。如果使用不同的分发版,请确保安装了X headers包

问题可能是#define WIN32。根据您的描述,我猜FLTK库正在使用它为Windows或Unix(X)有条件地编译其标头。因此,在为Windows编译时需要定义它,在为Unix编译时需要未定义它。处理此类问题的常用方法是在为Windows编译时向编译器调用添加/DWIN32选项。您可能还需要做一些事情来获得正确的库。

FWIW:完全可以设计库,使头文件适用于两个系统,而无需任何条件编译。如果您想要条件编译,您可能应该使用系统的预定义符号(例如_WIN32)。