Cara membangun & menginstal GLFW 3 dan menggunakannya dalam proyek Linux


94

GLFW3

Tadi malam saya bekerja lembur mencoba membangun paket GLFW 3 untuk Linux dari sumbernya. Proses ini memakan waktu yang sangat lama, sekitar 3 jam total, sebagian karena saya tidak terbiasa dengan CMake, dan sebagian lagi karena saya tidak terbiasa dengan GLFW.

Saya harap posting ini akan menyelamatkan Anda dari kesulitan yang saya alami kemarin! Saya pikir saya harus membuat tulisan singkat, dan semoga menyelamatkan Anda beberapa jam hidup Anda ...

Berkat "urraka", "b6", dan "niklas" di saluran IRC #glfw, saya dapat mengaktifkan glfw versi 3.0.1.

Ternyata ini bukanlah proses yang sepele (tentu saja bukan untuk saya, saya bukan ahli) karena tidak banyak dokumentasi di web tentang glfw3, terutama tentang pengaturannya dengan CMake.

Saya diminta untuk membagi ini menjadi bagian tanya jawab, jadi saya telah melakukannya, dan bagian jawaban sekarang ada di bawah.

Apakah Anda pengelola GLFW, atau anggota tim GLFW?

Jika salah satu pengelola GLFW3 melihat ini, maka pesan saya kepada mereka adalah tambahkan bagian "pengaturan GLFW3 di Windows, Mac OS X dan Linux" ke situs web Anda! Sangat mudah untuk menulis program dengan GLFW, karena dokumentasi online cukup bagus, scan cepat dari semua kelas dan modul yang tersedia dan Anda akan siap untuk pergi. Contoh proyek uji yang ditampilkan di sini juga sangat bagus. Dua masalah utama yang saya temukan adalah, pertama bagaimana cara menyiapkan GLFW3 di sistem saya, dan kedua bagaimana cara membangun proyek GLFW3? Kedua hal ini mungkin tidak cukup jelas bagi yang bukan ahli.

Edit

Melihat sekilas hari ini (Tanggal: 2014-01-14) sepertinya situs GLFW telah mengalami perubahan besar sejak saya terakhir melihatnya dan sekarang ada bagian tentang kompilasi GLFW dan program buliding dengan GLFW, yang menurut saya baru.


Terima kasih telah menempatkan ini di sini - jelas banyak pekerjaan yang telah dilakukan. Maukah Anda membaginya menjadi pertanyaan dan jawaban? Anda dapat menambahkan jawaban Anda sendiri ke pertanyaan Anda sendiri dan menandainya sebagai benar.
Fraser

@ Fraser Ya tentu saja jika menurut Anda akan lebih baik seperti itu
user3728501

1
Saya setuju itu. Saya sangat menyukai GLFW tetapi sangat frustrasi karena tidak menemukan dokumentasi apa pun tentang cara mengkompilasi v3 di bawah Mac, dll.
user18490

1
@ user18490 Ya saya menemukan hal yang mengejutkan, karena GLFW tampaknya menjadi "kekenyangan yang lebih baik". Saya yakin mereka menyebutkan dalam dokumentasinya bahwa kekenyangan hanya baik untuk pembelajaran dan jika Anda menginginkan lib window profesional, gunakan GLFW. Jadi yang mengejutkan adalah mereka memberi tahu Anda betapa bagusnya itu tetapi tidak memberi tahu Anda cara menginstalnya! (Sangat berbeda dengan SFML)
user3728501

@ Burung gagak. Saya akhirnya menemukan beberapa informasi berguna di halaman web ini mengenai pemasangan GLFW: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/…
user18490

Jawaban:


127

Langkah 1: Menginstal GLFW 3 di sistem Anda dengan CMAKE

Untuk instalasi ini, saya menggunakan KUbuntu 13.04, 64bit.

Langkah pertama adalah mengunduh versi terbaru (dengan asumsi versi yang akan datang bekerja dengan cara yang sama) dari www.glfw.org , mungkin menggunakan tautan ini .

Langkah selanjutnya adalah mengekstrak arsip, dan membuka terminal. cdke direktori glfw-3.XX dan menjalankan cmake -G "Unix Makefiles"Anda mungkin memerlukan hak akses yang lebih tinggi, dan Anda mungkin juga perlu menginstal dependensi build terlebih dahulu . Untuk melakukan hal ini, cobalah sudo apt-get build-dep glfw atau sudo apt-get build-dep glfw3 atau melakukannya secara manual , seperti yang saya lakukan menggunakan sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Mungkin ada libs lain yang Anda butuhkan seperti perpustakaan pthread ... Ternyata aku punya mereka sudah. (Lihat opsi -l yang diberikan pada tahap penaut g ++, di bawah.)

Sekarang Anda dapat mengetik makedan kemudian make install, yang mungkin mengharuskan Anda untuk mengetik sudoterlebih dahulu.

Oke, Anda harus mendapatkan beberapa keluaran verbose pada tiga tahap CMake terakhir, memberi tahu Anda apa yang telah dibangun atau di mana ia ditempatkan. (Dalam /usr/include, misalnya.)

Langkah 2: Buat program pengujian dan kompilasi

Langkah selanjutnya adalah menjalankan vim ("apa ?! vim ?!" katamu) atau editor IDE / teks pilihan Anda ... Saya tidak menggunakan vim, saya menggunakan Kate, karena saya menggunakan KUbuntu 13.04 ... Bagaimanapun, unduh atau salin program uji dari sini (di bagian bawah halaman) dan simpan, keluar.

Sekarang kompilasi menggunakan g++ -std=c++11 -c main.cpp- tidak yakin apakah c ++ 11 diperlukan tetapi saya menggunakannya nullptr, saya membutuhkannya ... Anda mungkin perlu memutakhirkan gcc ke versi 4.7, atau versi 4.8 yang akan datang ... Info tentang itu di sini .

Kemudian perbaiki kesalahan Anda jika Anda mengetik program dengan tangan atau mencoba menjadi "terlalu pintar" dan sesuatu tidak berhasil ... Kemudian tautkan program tersebut menggunakan monster ini! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiJadi Anda lihat, di bagian "install build dependencies", Anda mungkin juga ingin memeriksa apakah GL, GLU, X11 Xxf86vm (apa pun itu) Xrandr posix-thread dan Xi (apa pun itu) pustaka pengembangan telah diinstal juga. Mungkin memperbarui driver grafis Anda juga, saya pikir GLFW 3 mungkin memerlukan OpenGL versi 3 atau lebih tinggi? Mungkin seseorang bisa memastikannya? Anda mungkin juga perlu menambahkan opsi linker -ldl -lXinerama -lXcursoragar berfungsi dengan benar jika Anda mendapatkan referensi yang tidak ditentukan ke dlclose(kredit ke @ user2255242).

Dan, ya, saya benar-benar membutuhkan sebanyak -litu!

Langkah 3: Anda sudah selesai, semoga harimu menyenangkan!

Semoga informasi ini benar dan semuanya bekerja untuk Anda, dan Anda menikmati menulis program tes GLFW. Juga semoga panduan ini telah membantu, atau akan membantu, beberapa orang di masa depan yang berjuang seperti saya hari ini kemarin!

Omong-omong, semua tag adalah hal yang saya cari di stackoverflow untuk mencari jawaban yang tidak ada. (Sampai sekarang.) Mudah-mudahan itulah yang Anda cari jika Anda berada dalam posisi yang sama dengan saya.

Catatan Penulis:

Ini mungkin bukan ide yang bagus. Metode ini (menggunakan sudo make install) mungkin berbahaya bagi sistem Anda. (Lihat Jangan Hancurkan Debian)

Idealnya saya, atau orang lain, harus mengusulkan solusi yang tidak hanya menginstal file lib dll ke direktori default sistem karena ini harus dikelola oleh manajer paket seperti apt, dan melakukannya dapat menyebabkan konflik dan merusak sistem manajemen paket Anda.

Lihat "jawaban 2020" baru untuk solusi alternatif.


Saya menghabiskan waktu berjam-jam mencoba memikirkan hal ini. Jawaban ini berhasil untuk saya: Ubuntu 13.04, x64. NetBeans C ++ IDE (tambahkan baris linker di Project Properties-> Build-> Linker-> Libraries-> Add Option-> Other Option - jika tidak ikuti instruksi secara verbatim)
Scott Drew

Rupanya (dengan GLFW 3.0.3) ada sesuatu yang digunakan powsehingga menambah -lmopsi kompilasi memperbaikinya.
Forest Katsch

1
Edward, terima kasih. Saya membutuhkan kewarasan ini-memeriksa bahwa semua persyaratan -l tidak hanya berarti bahwa saya melakukan sesuatu yang salah.
salah

3
Bung, Anda adalah seorang fu **** GENIUS !!!! Anda punya 3 jam, saya punya 3 hari untuk mencoba melakukan ini (sebenarnya meneliti dari mana untuk memulai, membaca tentang sejarah kekenyangan dan sebagainya) terima kasih banyak terima kasih banyak; Saya juga ingin memberi nasihat bahwa saya membaca halaman glfw, tidak bisa melakukan pekerjaan setelah tutorial mereka, hampir menyerah ketika saya menemukan ini dan mereka tidak menjelaskan begitu sederhana dan langsung seperti yang Anda lakukan. pekerjaan luar biasa yang Anda lakukan di sini !!
Victor R. Oliveira

1
Pada Linux Mint yang bersih saya harus menginstal paket-paket ini:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Lenar Hoyt

18

Saya menyelesaikannya dengan cara ini

File pkg-config menjelaskan semua tanda waktu kompilasi dan waktu tautan serta dependensi yang diperlukan untuk menggunakan pustaka.

pkg-config --static --libs glfw3

tunjukkan itu padaku

-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  

Saya tidak tahu apakah semua lib ini benar-benar diperlukan untuk kompilasi tetapi bagi saya itu berfungsi ...


3
Jawaban ini harus dilihat. Saya tidak tahu tentang pkg-config sebelumnya. Tetapi mulai hari ini saya akan menggunakannya sampai akhir, karena ini akan membantu saya menyelesaikan segala jenis masalah ketergantungan penautan. Terima kasih atas jawaban yang luar biasa.
Sayan Bhattacharjee

18

Perhatikan bahwa Anda tidak membutuhkan banyak -ljika Anda menginstal glfw dengan BUILD_SHARED_LIBSopsi. (Anda dapat mengaktifkan opsi ini dengan menjalankannya ccmaketerlebih dahulu).

Dengan cara ini sudo make installakan menginstal perpustakaan bersama di /usr/local/lib/libglfw.so. Anda kemudian dapat mengkompilasi file contoh dengan sederhana:

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

Kemudian jangan lupa untuk menambahkan / usr / local / lib / ke jalur pencarian pustaka bersama sebelum menjalankan program Anda. Ini dapat dilakukan dengan menggunakan:

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

Dan Anda dapat meletakkannya di Anda ~/.bashrcsehingga Anda tidak perlu mengetiknya terus-menerus.


1
informasi ini sangat penting bagi mereka yang ingin mengatur satu IDE daripada menggunakan terminal untuk mengkompilasi dan menjalankan; Bisakah Anda memberikan detail lebih lanjut tentang cara melakukan ini? Saya mencoba tetapi tidak berhasil sama sekali
Victor R. Oliveira

Noob di sini! Saya tahu ini agak tua, tetapi itu sangat membantu saya. Dapatkah seseorang menjelaskan (atau menautkan ke seseorang yang menjelaskan) mengapa menggunakan pustaka bersama akan membuatnya jadi kita tidak perlu menautkan semua pustaka lainnya, banyak di antaranya juga file objek bersama? Juga, saya harus mengatur variabel LD_LIBRARY_PATH setelah kompilasi, atau menghadapi kesalahan gnu ketika saya mencoba menjalankan executable yang baru saya kompilasi.
Sammaron

1
Hai Sammaron, terima kasih telah berbicara tentang LD_LIBRARY_PATH, saya akan memperbarui jawaban saya untuk menyertakan ini. Alasan Anda tidak perlu menentukan semua pustaka lain saat menggunakan pustaka glfw adalah karena glfw sudah memuatnya. Anda dapat menggunakan perintah ldduntuk memeriksa pustaka apa yang dimuat oleh program saat dijalankan. Ini juga merupakan cara yang baik untuk memeriksa bahwa perpustakaan ditemukan dengan benar. Anda dapat menggunakan lddprogram Anda dan /usr/local/lib/libglfw.so untuk membandingkan.
CastleDefender

Terima kasih balasannya! Selain itu, saya ingin sedikit memperbaiki diri sendiri: variabel LD_LIBRARY_PATH adalah solusi yang layak, tetapi jika pustaka dipasang di jalur standar yang akan dicari oleh loader, menjalankannya sudo ldconfigakan menyelesaikan masalah ini, dan tidak memerlukan LD_LIBRARY_PATH untuk dikonfigurasi setiap saat. Jawaban ini memberikan diskusi mengapa ini lebih disukai.
Sammaron

Setelah melakukan build bersama, saya harus mengkompilasi / menautkan 2 orang lain. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL bekerja untuk saya.
Sridhar Thiagarajan

9

Karena jawaban yang diterima tidak memungkinkan pengeditan lagi, saya akan meringkasnya dengan satu perintah salin-tempel (Ganti 3.2.1 dengan versi terbaru yang tersedia di baris pertama):

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

Jika Anda ingin mengkompilasi program gunakan perintah berikut:

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

Jika Anda mengikuti tutorial learnopengl.com, Anda mungkin harus menyiapkan GLAD juga. Jika demikian, klik tautan ini

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

lalu klik tombol "Generate" di pojok kanan bawah situs web dan unduh file zip. Ekstrak dan kompilasi sumbernya dengan perintah berikut:

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

Sekarang, perintah untuk mengkompilasi program Anda menjadi seperti ini:

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
Cemerlang! Bekerja untuk saya di Ubuntu 16.04 dengan GLFW v3.2.1. Hanya dua koreksi kecil: set version = XXX seharusnya hanya versi = "XXX" dan tidak boleh ada .zip di akhir baris ini: cd glfw - $ {version} .zip
Tim

2

Panduan yang bagus, terima kasih. Dengan sebagian besar instruksi di sini, hampir dibuat untuk saya tetapi saya memiliki satu kesalahan yang tersisa.

/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

Setelah mencari kesalahan ini, saya harus menambahkan -ldlke baris perintah.

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

Kemudian aplikasi contoh "hello GLFW" dikompilasi dan ditautkan.

Saya cukup baru mengenal linux jadi saya tidak sepenuhnya yakin apa sebenarnya fungsi perpustakaan tambahan ini ... selain memperbaiki kesalahan penautan saya. Saya memang melihat saklar garis cmd di posting di atas.


Saya punya file .o dan .exec .. tolong bantu saya, bagaimana cara menjalankannya?
Buddhika Chaturanga

0

Jika ada yang malas dan mungkin tidak tahu cara mengkonfigurasi shell untuk semua library dan -l s, maka saya membuat skrip python (Anda harus memiliki python3, sebagian besar pengguna linux memilikinya.) Yang memungkinkan Anda untuk dengan mudah mengkompilasi skrip dan menjalankannya tanpa terlalu khawatir, hanya ada panggilan sistem biasa, hanya diatur dengan rapi, saya membuatnya untuk diri saya sendiri tetapi mungkin itu akan berguna: Ini dia


0

Jawaban yang dijelaskan dengan baik sudah ada di sana, tetapi saya menggunakan resep SHORTER ini :

  1. Pasang Linuxbrew
  2. $ brew install glfw
  3. cd /home/linuxbrew/.linuxbrew/Cellar/glfw/X.X/include
  4. sudo cp -R GLFW /usr/include

Penjelasan: Kami berhasil membangun GLFW oleh CMAKE yang dilakukan oleh Linuxbrew (port Linux dari Homebrew tercinta). Kemudian salin file header ke tempat Linux membaca ( /usr/include).


0

Jawaban yang Diperbarui 2020

Sekarang tahun 2020 (7 tahun kemudian) dan saya telah belajar lebih banyak tentang Linux selama ini. Secara khusus, mungkin bukan ide yang baik untuk menjalankannya sudo make installsaat menginstal pustaka, karena ini dapat mengganggu sistem manajemen paket. (Dalam hal ini aptkarena saya menggunakan Debian 10.)

Jika ini tidak benar, tolong perbaiki saya di komentar.

Solusi alternatif yang diusulkan

Informasi ini diambil dari dokumen GLFW, namun saya telah memperluas / menyederhanakan informasi yang relevan dengan pengguna Linux.

  • Buka direktori home dan klon repositori glfw dari github
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • Pada titik ini Anda dapat membuat direktori build dan mengikuti petunjuk di sini ( instruksi membangun glfw ), namun saya memilih untuk tidak melakukannya. Perintah berikut tampaknya masih berfungsi pada tahun 2020 namun tidak secara eksplisit dinyatakan oleh instruksi online glfw.
cmake -G "Unix Makefiles"
  • Anda mungkin perlu menjalankan sudo apt-get build-dep glfw3sebelum (?). Saya menjalankan perintah ini dan sudo apt install xorg-devsesuai instruksi.

  • Akhirnya lari make

  • Sekarang di direktori proyek Anda, lakukan hal berikut. (Buka proyek Anda yang menggunakan glfw libs)

  • Buat CMakeLists.txt, milik saya terlihat seperti ini

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)
  • Jika Anda tidak suka CMake maka saya minta maaf, tetapi menurut saya ini adalah cara termudah untuk membuat proyek Anda bekerja dengan cepat. Saya akan merekomendasikan belajar menggunakannya, setidaknya untuk tingkat dasar. Sayangnya saya tidak tahu ada tutorial CMake yang bagus

  • Kemudian lakukan cmake .dan make, proyek Anda harus dibuat dan ditautkan ke lib bersama glfw3

  • Ada beberapa cara untuk membuat lib terkait dinamis. Saya yakin saya telah menggunakan metode statis di sini. Tolong beri komentar / tambahkan bagian dalam jawaban di bawah ini jika Anda tahu lebih banyak daripada saya

  • Ini harus bekerja pada sistem lain, jika tidak beri tahu saya dan saya akan membantu jika saya bisa

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.