2

假设我在 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”

4

4 回答 4

4

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

编译器把你的代码翻译成你的特定架构和平台可以理解的低级代码,Windows 和 Mac 不一样。这个较低级别的代码基本上与 C++、FLTK 或它们中的任何一个的兼容性承诺无关。

这里的类比是,在道路左侧驾驶汽车在机械上与在道路右侧驾驶汽车相同(所以让我们忽略导航差异以及您可能是转向不同的方向),因此您对如何驾驶汽车的知识同样适用于这两种情况……但这并不意味着您可以简单地将汽车停在法国或美国的道路左侧。你会造成相当严重的事故。当您将驾驶汽车的知识应用于特定环境时,您必须适应当地的道路规则。

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

于 2012-11-14T12:11:02.387 回答
3

如果您无法访问 Linux 或 Mac OSX 计算机,则必须对其进行交叉编译。为此,您必须找到现有的交叉编译器,将源下载到例如 GCC 并自己构建。从“交叉编译器”(或类似的)中进行一些搜索,您会发现一些易于遵循的教程。

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

最后,还有诸如Wine 之类的环境将允许 Windows 程序在其他平台上运行。

于 2012-11-14T12:07:31.703 回答
0

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

您收到的关于未找到的错误消息X11/X.h是由于缺少编译器标志(请参阅1)、需要首先包含的先决条件(请参阅2)或缺少标头(请参阅3)引起的。

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

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

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

于 2012-11-14T13:33:02.580 回答