GLFW 3をビルドしてインストールし、Linuxプロジェクトで使用する方法


95

GLFW3

昨夜、Linux向けのGLFW 3パッケージをソースからビルドしようとして遅くまで働いていました。このプロセスには、CMakeに不慣れであるという理由と、GLFWに不慣れであるという理由で、合計3時間という非常に長い時間がかかりました。

この投稿が、昨日の問題からあなたを救ってくれることを願っています!私は短い記事を書いて、うまくいけばあなたの人生の数時間を救うべきだと思いました...

#glfw IRCチャンネルの「urraka」、「b6」、「niklas」のおかげで、glfwバージョン3.0.1を動作させることができました。

これは簡単なプロセスではないことがわかりました(確かに私にとっては、私は専門家ではありません)。glfw3、特にCMakeでのセットアップに関するWeb上のドキュメントはあまりないためです。

これを質問と回答のセクションに分割するように依頼されたので、それを実行しました。回答の部分は以下にあります。

あなたはGLFWのメンテナーですか、それともGLFWチームのメンバーですか?

GLFW3のメンテナーのいずれかがこれを見つけた場合、私のメッセージは、「Windows、Mac OS X、およびLinuxでのGLFW3のセットアップ」セクションをWebサイトに追加してください!GLFWを使用してプログラムを作成するのは非常に簡単です。オンラインドキュメントは非常に優れており、利用可能なすべてのクラスとモジュールをすばやくスキャンすれば準備完了です。ここで取り上げたテストプロジェクトの例も非常に優れています。私が見つけた2つの主な問題は、1つはシステムにGLFW3をセットアップする方法、もう1つはGLFW3プロジェクトをビルドする方法でした。これら2つのことは、おそらく、専門家でない人には十分に明確ではありません。

編集する

本日(日付:2014-01-14)の概要を確認したところ、GLFWのWebサイトが最後に確認してから大幅に変更されているように見え、GLFWのコンパイルとGLFWを使用したプログラムの作成に関するセクションがあり、これは新しいと思います。


これをここに置いてくれてありがとう-明らかに多くの作業が行われています。質問と回答に分けていただけませんか。自分の質問に自分の回答を追加して、正解としてマークできます。
Fraser

当然の@Fraserはいあなたはそれがより良いという方法だろうと思われる場合
user3728501

1
同感です。私はGLFWがとても好きですが、Macなどでv3をコンパイルする方法に関するドキュメントを見つけられなかったので、本当にイライラしました
user18490

1
@ user18490ええ、GLFWは「より良い過剰」であるように見えるので、私はその種の驚くべきことを見つけました。彼らは彼らのドキュメントでglutは学習にのみ良いことを述べていると確信しています、そしてあなたがプロのウィンドウライブラリが欲しいならGLFWを使ってください。だから意外なことは、彼らはそれがどれほど良いかをあなたに言うが、それをインストールする方法を教えないということです!(SFMLとはかなり異なります)
user3728501 2013

@エドワードバード。:私は最終的にGLFWのインストールについて、このWebページ上のいくつかの有用な情報が見つからscratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/...
user18490

回答:


125

ステップ1:CMAKEを使用してシステムにGLFW 3をインストールする

このインストールでは、KUbuntu 13.04、64ビットを使用していました。

最初のステップは、おそらくこのリンクを使用して、www.glfw.orgから最新バージョン(将来のバージョンも同様に動作すると想定)をダウンロードすることです。

次のステップは、アーカイブを抽出し、ターミナルを開くことです。cdglfw-3.XXディレクトリに移動して実行cmake -G "Unix Makefiles"するには、昇格された特権が必要な場合があります。また、ビルドの依存関係を最初インストールする必要がある場合もあります。これを行うには、試すsudo apt-get build-dep glfw か、 sudo apt-get build-dep glfw3 または 手動でそれを行う、私が使用して行ったようsudo apt-get install cmake xorg-dev libglu1-mesa-dev...なのpthreadライブラリなど、あなたが必要とする他のlibsがあるかもしれません...どうやら私はすでにそれを持っていました。(下記のg ++​​リンカーステージに指定された-lオプションを参照してください。)

今、次のように入力することができmake、その後とmake install、おそらくする必要があろう、sudo最初。

さて、最後の3つのCMakeステージで、何がビルドされたか、どこに配置されたかを示す詳細な出力を取得する必要があります。(/usr/includeたとえば、。)

ステップ2:テストプログラムを作成してコンパイルする

次のステップは、vim(「何?!vim ?!」と言う)またはお好みのIDE /テキストエディターを起動することです...私はvimを使用しませんでした。KUbuntu13.04を使用しているため、Kateを使用しました...とにかく、ここ(ページの下部)からテストプログラムをダウンロードまたはコピーし、保存して終了します。

今すぐ使用してコンパイルg++ -std=c++11 -c main.cpp-c ++ 11が必要かどうかは不明ですが、使用しましnullptrたが、必要でした... gccをバージョン4.7または次のバージョン4.8にアップグレードする必要があるかもしれません...詳細はこちら

次に、プログラムを手動で入力したか、「巧妙すぎ」て何かがうまくいかなかった場合のエラーを修正します。次に、このモンスターを使用してリンクします。g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiつまり、「ビルド依存関係のインストール」の部分で、GL、GLU、X11 Xxf86vm(それが何であれ)Xrandr posix-threadおよびXi(それが何であれ)開発ライブラリもインストールされていることを確認することもできます。グラフィックドライバも更新するかもしれませんが、GLFW 3にはOpenGLバージョン3以降が必要になると思いますか?おそらく誰かがそれを確認できますか?(@ user2255242へのクレジット)への-ldl -lXinerama -lXcursor未定義の参照を取得している場合に正しく機能させるには、リンカーオプションを追加する必要がある場合もありますdlclose

そして、はい、本当に多く-lのs が必要でした!

ステップ3:これで終了です。良い一日を!

うまくいけば、この情報が正しく、すべてがうまくいったこと、そしてGLFWテストプログラムの作成を楽しんだことを願います。また、このガイドが、昨日私が今日のように苦労していた将来の何人かの人々を助けたか、助けてくれることを願っています!

ちなみに、すべてのタグは、私がstackoverflowで探していたもので、存在しない答えを探していました。(今まで)うまくいけば、私と同じような立場にいる人が探していたものです。

著者メモ:

これは良い考えではないかもしれません。この方法(sudo make installを使用)は、システムに危険を及ぼす可能性があります。(Debianを壊さないでください)

理想的には、私または他の誰かがlibファイルなどをシステムのデフォルトディレクトリにインストールするだけでなく、これらをのようなパッケージマネージャーで管理する必要があるソリューションを提案する必要がaptあります。そうすると、競合が発生し、パッケージ管理システムが破損する可能性があります。

代替ソリューションについては、新しい「2020回答」を参照してください。


私はこれを理解しようと何時間も費やしました。この答えは私にとってうまくいきました:Ubuntu 13.04、x64。NetBeans C ++ IDE(プロジェクトのプロパティ->ビルド->リンカー->ライブラリ->オプションの追加->その他のオプションにリンカー行を追加-それ以外の場合は指示どおりに実行)
Scott Drew

どうやら(GLFW 3.0.3では)何かが使用するpowので-lm、コンパイルオプションに追加すると修正されます。
Forest Katsch 2013年

1
エドワード、ありがとう。-l要件のすべてが、私が何か間違ったことをしているという意味ではないことを、この健全性チェックが必要でした。
間違って2013

3
あなたはfu **** GENIUSです!!! あなたは3時間、私はこれを試すために3日間(実際にはどこから始めればいいのか、とにかく過剰履歴について読むなど)本当にありがとうございましたありがとうございました。また、glfwのページを読んで、チュートリアルに従って仕事をすることができなかったため、これを見つけたときほとんどあきらめ、あなたのように単純で直接的な説明をしていないこともお伝えしたいと思います。あなたがここでやった素晴らしい仕事!!
ビクターR.オリベイラ

1
クリーンLinuxではミント、私はこれらのパッケージをインストールする必要がありました:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Lenarホイト

18

このように解決しました

pkg-configファイルには、ライブラリを使用するために必要なすべてのコンパイル時およびリンク時のフラグと依存関係が記述されています。

pkg-config --static --libs glfw3

それを見せて

-L/usr/local/lib -lglfw3 -lrt -lXrandr -lXinerama -lXi -lXcursor -lGL -lm -ldl -lXrender -ldrm -lXdamage -lX11-xcb -lxcb-glx -lxcb-dri2 -lxcb-dri3 -lxcb-present -lxcb-sync -lxshmfence -lXxf86vm -lXfixes -lXext -lX11 -lpthread -lxcb -lXau -lXdmcp  

これらのすべてのライブラリがコンパイルに実際に必要かどうかはわかりませんが、私にとっては機能します...


3
この答えは必見です。以前はpkg-configについて知りませんでした。しかし、今日から最後まで使用します。これは、あらゆる種類のリンク依存関係の問題を解決するのに役立つためです。そのような素晴らしい答えをありがとう。
Sayan Bhattacharjee 2016年

18

オプションで-lglfwをインストールする場合、それほど多くのは必要ないことに注意してくださいBUILD_SHARED_LIBS。(ccmake最初に実行すると、このオプションを有効にできます)。

これによりsudo make install、共有ライブラリがにインストールされ/usr/local/lib/libglfw.soます。その後、サンプルファイルを単純なものでコンパイルできます。

g++ main.cpp -L /usr/local/lib/ -lglfw

次に、プログラムを実行する前に、共有ライブラリの検索パスに/ usr / local / lib /を追加することを忘れないでください。これは以下を使用して行うことができます:

export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}

そして、あなたはそれをあなたの中に置くことができる~/.bashrcので、いつもそれをタイプする必要はありません。


1
この情報は、ターミナルを使用してコンパイルおよび実行するのではなく、1つのIDEをセットアップする場合に非常に重要です。これを行う方法について詳しく教えてください。私は試しましたがまったく成功しませんでした
ビクターR.オリベイラ

こんにちは!これは少し古いことは知っていますが、本当に役に立ちました。共有ライブラリを使用するとなぜ他のすべてのライブラリをリンクする必要がないので、誰かが説明(または説明している誰かへのリンク)でリンクを作成する必要がないのでしょうか。それらの多くは共有オブジェクトファイルでもありました。また、コンパイル後にLD_LIBRARY_PATH変数設定するか、新しくコンパイルした実行可能ファイルを実行しようとすると、gnuエラーの怒りに直面する必要がありました。
Sammaron、2014

1
こんにちは、Sammaronさん、LD_LIBRARY_PATHについてお話していただきありがとうございます。これを含めるように回答を更新します。glfwライブラリを使用するときに他のすべてのライブラリを指定する必要がないのは、glfwがすでにそれらをロードしているためです。コマンドlddを使用して、プログラムの実行時にプログラムによってロードされるライブラリを確認できます。また、ライブラリが適切に検出されていることを確認するための良い方法でもあります。lddプログラムと/usr/local/lib/libglfw.soを使用して比較できます。
CastleDefender 2014

返信いただきありがとうございます!また、私は少し修正したかった:LD_LIBRARY_PATH変数は実行可能なソリューションですが、ライブラリが標準パスにインストールされている場合、ローダーがとにかく検索する場合、実行sudo ldconfigするとこの問題が解決され、LD_LIBRARY_PATHを構成する必要はありません毎回。この回答は、なぜこれが好ましいのかについての議論を提供します。
Sammaron、2014

build sharedを実行した後、他の2つをコンパイル/リンクする必要がありました。g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGLがうまくいきました。
Sridhar Thiagarajan

9

承認された回答ではそれ以上の編集は許可されていないため、1つのcopy-pasteコマンドで要約します(3.2.1を最初の行で入手可能な最新バージョンに置き換えます)。

version="3.2.1" && \
wget "https://github.com/glfw/glfw/releases/download/${version}/glfw-${version}.zip" && \
unzip glfw-${version}.zip && \
cd glfw-${version} && \
sudo apt-get install cmake xorg-dev libglu1-mesa-dev && \
sudo cmake -G "Unix Makefiles" && \
sudo make && \
sudo make install

プログラムをコンパイルする場合は、次のコマンドを使用します。

g++ -std=c++11 -c main.cpp && \
g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lXinerama -lXcursor

learnopengl.comチュートリアルに従っている場合は、GLADも設定する必要がある場合があります。そのような場合はこのリンクをクリックしてください

http://glad.dav1d.de/#profile=core&specification=gl&api=gl%3D3.3&api=gles1%3Dnone&api=gles2%3Dnone&api=glsc2%3Dnone&language=c&loader=on

次に、Webサイトの右下隅にある[生成]ボタンをクリックして、zipファイルをダウンロードします。それを抽出し、次のコマンドでソースをコンパイルします。

g++ glad/src/glad.c -c -Iglad/include

これで、プログラムをコンパイルするコマンドは次のようになります。

g++ -std=c++11 -c main.cpp -Iglad/include && \
g++ main.o glad.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lXinerama -lXcursor

2
鮮やかさ!Ubuntu 16.04のGLFW v3.2.1で動作しました。2つのマイナーな修正のみ:set version = XXXは単にversion = "XXX"であり、この行の最後に.zipがあってはなりません:cd glfw-$ {version} .zip
Tim

2

素晴らしいガイド、ありがとうございます。ここでほとんどの指示を与えられて、それはほとんど私のために建てられましたが、私は一つのエラーを残しました。

/usr/bin/ld: //usr/local/lib/libglfw3.a(glx_context.c.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

このエラーを検索した後-ldl、コマンドラインに追加する必要がありました。

g++ main.cpp -lglfw3 -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lGL -lpthread -ldl

次に、「hello GLFW」サンプルアプリをコンパイルしてリンクします。

私はLinuxにかなり慣れていないので、この追加のライブラリが正確に何をするのかは完全にはわかりません...リンクエラーを修正する以外は。ただし、上記の投稿でそのcmd行の切り替えを確認しています。


.oファイルと.execファイルを取得しました。実行方法を教えてください。
Buddhika Chaturanga

0

だれかが怠惰になっていて、おそらくすべてのライブラリと-lのシェルを構成する方法がわからない場合は、簡単にコンパイルできるpythonスクリプトを作成しました(python3が必要です。ほとんどのLinuxユーザーが使用しています)。スクリプトを作成し、あまり心配せずに実行します。通常のシステムコールがあり、きちんと配置されているだけです。自分用に作成しましたが、多分役に立つでしょう。ここにあります。


0

よく説明された答えはすでにそこにありますが、私はこのSHORTERレシピを通り抜けました

  1. Linuxbrewをインストールする
  2. $ brew install glfw
  3. cd /home/linuxbrew/.linuxbrew/Cellar/glfw/X.X/include
  4. sudo cp -R GLFW /usr/include

説明:私たちはLinuxbrew(最愛のHomebrewのLinuxポート)によって行われたCMAKEによってGLFWを構築することに成功しました。次に、ヘッダーファイルをLinuxが読み取る場所にコピーします(/usr/include)。


0

2020更新された回答

それは2020年(7年後)であり、この間にLinuxについてさらに学びました。特に、sudo make installライブラリのインストール時に実行することは、パッケージ管理システムに干渉する可能性があるため、お勧めできません。(この場合apt、私はDebian 10を使用しています。)

これが正しくない場合は、コメントで私を訂正してください。

代替案案

この情報はGLFWドキュメントから取得されましたが、Linuxユーザーに関連する情報を拡張/合理化しました。

  • ホームディレクトリに移動し、githubからglfwリポジトリのクローンを作成します
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • この時点でビルドディレクトリを作成し、ここの指示(glfwビルド指示)に従うことができますが、私はそれをしないことを選択しました。次のコマンドは2020年でも機能しているようですが、glfwオンラインの説明では明示的に述べられていません。
cmake -G "Unix Makefiles"
  • sudo apt-get build-dep glfw3前に実行する必要がある場合があります(?)。私はこのコマンドとsudo apt install xorg-dev指示に従って両方を実行しました。

  • 最後に実行します make

  • 次に、プロジェクトディレクトリで、次の操作を行います。(glfwライブラリを使用するプロジェクトに移動します)

  • を作成しCMakeLists.txt、私のように見えます

CMAKE_MINIMUM_REQUIRED(VERSION 3.7)
PROJECT(project)

SET(CMAKE_CXX_STANDARD 14)
SET(CMAKE_BUILD_TYPE DEBUG)

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)

add_subdirectory(/home/<user>/glfw /home/<user>/glfw/src)


FIND_PACKAGE(OpenGL REQUIRED)

SET(SOURCE_FILES main.cpp)

ADD_EXECUTABLE(project ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(project glfw)
TARGET_LINK_LIBRARIES(project OpenGL::GL)
  • CMakeが気に入らない場合は申し訳ありませんが、私の意見では、プロジェクトを迅速に機能させる最も簡単な方法です。少なくとも基本的なレベルで、それを学ぶことをお勧めします。残念ながら、私は良いCMakeチュートリアルを知りません

  • 次に、cmake .make、プロジェクトをビルドして、glfw3共有ライブラリに対してリンクする必要があります

  • 動的にリンクされたlibを作成する方法はいくつかあります。ここでは静的メソッドを使用したと思います。私が知っている以上のことがわかっている場合は、この回答にコメント/セクションを追加してください

  • これは他のシステムでも機能するはずですが、私に知らせていない場合、私ができる場合は私がお手伝いします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.