7

私は Stroustrup の Principles and Practices ...C++ からグラフィックスの例を動作させようとしていますが、(まだ) 役に立ちません。私は fltk のものをインストールしましたが、彼の本の付録で提案されているプログラムを使用してウィンドウを表示することができたので、それがうまく機能していることを知っています:

#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Window.H>

int main(){

    Fl_Window window(200,200, "title here");
    Fl_Box box(0,0,200,200,"Hey, hello wrld");
    window.show();
    return Fl::run();
}

ただし、彼の Simple_window.h (彼のサイトで見つけることができます) を使用して自分で試してみると、既に usr/include/X11/Xh にあるため、「「ウィンドウ」への参照があいまいです」となります。そこで、名前空間を関連するものに指定してみました:

struct Simple_window : Graph_lib::Window {  //Changed Window to inc. namespace
    Simple_window(Point xy, int w, int h, const string& title );

    bool wait_for_button(); // simple event loop

.
.
.

しかし、これにより、理解できないエラーがさらに多くなります。

$ clear; g++ -Wno-deprecated window.cpp -o holz
    /tmp/ccIFivNg.o: In function `main':
    window.cpp:(.text+0x64): undefined reference to `Simple_window::Simple_window(Point, int, int, String const&)'
    /tmp/ccIFivNg.o: In function `Graph_lib::Window::~Window()':
    window.cpp:(.text._ZN9Graph_lib6WindowD2Ev[_ZN9Graph_lib6WindowD5Ev]+0x14): undefined reference to `vtable for Graph_lib::Window'

グラフィックの習得は、長く困難な道のりになると思います -_-

4

6 に答える 6

5

同じ苦境にある人のために、Stroustrup の著書「Programming: Principles and Practice using C++, 2nd Edition」のセクション 12.3 で、FLTK を使用して最初のプログラムのウィンドウを最終的にコンパイルして取得できるようにするために行ったことをここに残します。

Kubuntu 14.04にFLTKをインストールした後

$ sudo apt install libfltk1.3-dev

を使用して、付録 D のサンプル プログラムをコンパイルできます。

$ fltk-config --compile fltkTest.cpp

この投稿のおかげで、12章の最初の例でようやく軌道に乗ることができた様子がわかりました。 cwivagg と Nathan のコマンドと fltk-config で生成されたコマンドを比較すると、このコマンドで終了しました。

$ clang++ -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/freetype2 -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -g -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 -std=c++11 -o 's12_3_first' 's12_3_first.cpp' Simple_window.cpp Graph.cpp GUI.cpp Window.cpp

-lfltk_images と -std=c++11 を追加する必要がありました

しかし、今度はコンパイラーから出されたエラーに対処しなければなりませんでした。動作するプログラムを入手するには、Stroustrup がhttp://www.stroustrup.com/Programming/PPP2code/で提供したソースにいくつかの変更を加える必要がありました。

  1. Graph.h の std_lib_facilities.h のコメントを外しました
  2. Window のあいまいさを解決するには、Simple_window.h の 9 行目に Graph_lib::Window を指定する必要がありました。
  3. 107 行目と 113 行目の std_lib_facilities.h は、i が符号なしの場合に i<0 比較を使用します (ただし、これらは単なる警告です)。
  4. Graph.h の 159 行目は fl_color() を使用していますが、コンパイラはそれが Fl_Color であるべきだと言っています
  5. Point.h の Point のコンストラクターのコメントを解除する必要がありました。
  6. Simple_window.h の Simple_window.cpp にはいくつかの再定義があります。 Simple_window.cpp では、コンストラクター cb_next と wait_for_button の定義をコメントアウトしました (Simple_window.h のものとは異なります)。Simple_window.h では、wait_for_button と next の定義をコメントアウトしました。ちなみに、wait_for_button はどちらの形式でも機能しません。
  7. GUI.cpp には、Menu のコンストラクターの別の再定義があります。コメントアウトしました。
  8. セクション 12.3 の例の最後の行を win.wait_for_button; から変更しました。Fl::run(); に これは、付録 D の例から取ったものです。そうしないと、閉じるボタンでウィンドウが閉じないからです。

これらすべての変更により、最終的にウィンドウが本来あるべき状態になり、ウィンドウは次へボタンまたはウィンドウの閉じるボタンで閉じます(wait_for_buttonを使用すると、試みた後にCtrl-cでKonsoleからプログラムを終了する必要がありましたウィンドウの閉じるボタンで閉じてください)。

次の人が私がしなければならなかったすべての時間を費やす必要がないことを願っています。

編集:私のシステムとコンパイルコマンドを確認したところ、いくつかのカーペットが繰り返されていることに気付きました...そしてそれらは実際には私のKubuntuシステムには存在しません。したがって、ウィンドウを機能させるために最終的に何をするかを回答に書き留める必要があります。

オブジェクトファイルを取得するには:

$ clang++ -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -g -std=c++11 -c  Simple_window.cpp

私たちが欲しかった最初のプログラムを手に入れるために

% clang++ -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 -g -std=c++11 Simple_window.o Graph.o GUI.o Window.o -o z3 s12_3_first.cpp

これらは非常に簡単です(必要なときにいつでも書くことができます)

于 2016-03-31T01:23:04.037 に答える
1

まあ、これはグラフィック自体とは何の関係もありません。問題は、コンパイルする必要があるソース ファイルの 1 つだけをコマンド ラインに含めたことにあるようです。彼のウェブサイトから判断すると

g++ graph.cpp GUI.cpp Simple_window.cpp Window.cpp

より似ているようです。しかし、私はこれについて実際の経験がありません。

于 2011-08-20T19:20:32.180 に答える
1

トモラック、これが「進歩した」と言ったとき、私はとてもうれしかった. あなたが皮肉を言っていたかどうかはわかりませんが、何でも。

私はこの問題を解決しました (または、少なくとも、ウィンドウに三角形が表示されるようにすることができました)。ただし、これは、Stroustrup のコードの大部分をコメント アウトして編集した後でした。彼の本が初心者に適しているとは思えない. また、Linux を使用して彼の例をコンパイルしようとすることもお勧めしません。

これらの問題をグーグルで調べている人にとって、私の最終的な解決策は次のコマンドでした:

$ g++ -Wno-deprecated -I/usr/local/include -I/usr/include/freetype2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -o 'windows_working' win_test.cpp Graph.cpp GUI.cpp Simple_window.cpp Window.cpp  /usr/local/lib/libfltk.a -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11

これには、fltk と Stroustrup に関して必要なすべてが含まれます。ここで、私のプログラムは win_test.cpp で、出力は windows_working です。fltk ファイルで提供されているシェル スクリプトを調べてこれを取得し、/usr/inc/bin に配置しました。これは fltk-config と呼ばれます。

また、役に立つヒントは次のとおりです。Stroustrup のサイトから FL をダウンロードするだけでなく、彼らのサイトから fltk ソースをダウンロードしてください。次に、本の付録 D にあるテスト プログラムを試す前に、readme を読み、指示に従ってください。次に、彼のサンプル コードを試して、問題が解決するまで見つけたエラーを繰り返し修正します。私が助けてくれると思う、または私の解決方法を知りたい場合は、私にメールしてください (ただし、私は初心者なので、役に立たない可能性があります)。

于 2011-08-21T19:48:02.063 に答える
1

ネイサン

あなたの答えは、Stroustrup の単純な三角形プログラムを実装するための私自身の闘いにおいて、私にとって非常に役に立ちました。あなたのソリューションに基づいて、独自のソリューションを投稿したいと思います。Stroustrup のコードに 1 つの変更を加え、コンパイル スクリプトを大幅に拡張することで、三角形が表示されるようになりました。

g++ -I/usr/localinclude -I/usr/local/include/FL/images -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_THREAD_SAFE -D_REENTRANT -o 'myimplementationofstroustrup.o' 'myimplementationofstroustrup.cpp' 'Simple_window.cpp' 'Graph.cpp' 'GUI.cpp' 'Window.cpp' /usr/local/lib/libfltk.a -lpthread -ldl -lm -lX11 -L/usr/local/lib -lfltk_images -lfltk_png -lfltk_z -lfltk_jpeg -lfltk

あなたとの違いは次のとおりです。

1) すべての .cpp ファイルに引用符を追加する必要がありました...おそらくシステムの違いでしょうか?
2) 使用しなかった 6 つのフラグを最後に追加する必要がありました。そうしないと、「未定義の参照」エラーがさらに発生しました。
3) あいまいな参照エラーのため、Simple_window.h の 17 行目に "Graph_lib::Window" を指定する必要がありました。これが、Stroustrup のコードに加えなければならなかった唯一の変更でした。

于 2014-07-10T12:09:36.683 に答える