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 OS では動作しません。私が使っているのは単純な古い c++ とクロスプラットフォームの FLTK だけなので、これは私を驚かせました。

それで、私の質問は、どうすればこのコードを取得して、Linux OS と Mac OS で動作するようにコンパイルできるでしょうか? または、同じコードを保持し、別の方法でコンパイルして、別の OS で動作することさえ可能ですか? それが不可能な場合、何を変更する必要がありますか?

PS。コードは非常に単純ですが、#define WIN32 が存在することに疑問を持っている場合は、それがないと、コンパイラが "X/X11.h" のようなヘッダー ファイルの欠落を心配します。

4

4 に答える 4

4

コードは互換性がありますが、生成されるバイナリが互換性があるという意味ではありません。概して、これは決して当てはまりません

コンパイラはコードを受け取り、特定のアーキテクチャとプラットフォームが理解できる下位レベルのコードに変換します。Windows は Mac と同じではありません。この下位レベルのコードは、基本的に C++、FLTK、またはそれらのいずれかの互換性の約束とは何の関係もありません。

ここで例えると、道路の左側で車を運転することは、機械的には、道路の右側で車を運転することと同じです (ナビゲーションの違いや、おそらく車を運転する方法についてのあなたの知識は、どちらのシナリオにも同じように当てはまります。しかし、それは、フランスやアメリカで道路の左側に車をぶつけることができるという意味ではありません。かなり悲惨な事故を起こします。車の運転に関する知識を特定の環境に適用するときは、道路のローカルルールに合わせなければなりません。

ターゲット環境で同じコードを再コンパイルするか、クロスコンパイラを使用できます。

于 2012-11-14T12:11:02.387 に答える
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

The problem is probably the #define WIN32. From what you describe, I would guess that the FLTK library is using this to conditionally compile its headers either for Windows or for Unix (X). So you'd need it defined when compiling for Windows, and undefined when compiling for Unix. The usual way of handling such issues is to add a /DWIN32 option to the compiler invocation when compiling for Windows. You'll probably also have to do something to get the right libraries.

And FWIW: it's perfectly possible to design the library so that the header files work for both systems, without any conditional compilation. And if you want conditional compilation, you should probably use the system's predefined symbols (_WIN32, for example).

于 2012-11-14T13:33:02.580 に答える