GLFW 3 nasıl oluşturulur, kurulur ve bir Linux projesinde nasıl kullanılır?


95

GLFW3

Dün gece geç saatlere kadar Linux için GLFW 3 paketlerini kaynaktan oluşturmaya çalışıyordum. Bu süreç çok uzun sürdü, toplamda yaklaşık 3 saat, kısmen CMake'ye aşina olmadığım için ve kısmen de GLFW'ye aşina olmadığım için.

Umarım bu yazı sizi dün yaşadığım zorluklardan kurtarır! Kısa bir yazı yazmalıyım ve umarım hayatınızdan birkaç saat kurtarmam gerektiğini düşündüm ...

#Glfw IRC kanalındaki "urraka", "b6" ve "niklas" sayesinde glfw 3.0.1 sürümünü çalıştırmayı başardım.

Web'de glfw3 hakkında, özellikle CMake ile kurulum hakkında çok fazla belge olmadığı için, bunun önemsiz bir süreç olmadığı ortaya çıktı (kesinlikle benim için değil, uzman değilim).

Bunu bir soru cevap bölümüne ayırmam istendi ve bu yüzden bunu yaptım ve cevap bölümleri şimdi aşağıda.

GLFW'nin bir koruyucusu veya GLFW ekibinin bir üyesi misiniz?

GLFW3'ün geliştiricilerinden herhangi biri bunu görürse, onlara mesajım lütfen web sitenize "Windows, Mac OS X ve Linux üzerinde GLFW3 kurulumu" bölümü ekleyin! GLFW ile program yazmak oldukça kolaydır, çünkü çevrimiçi dokümantasyon oldukça iyidir, mevcut tüm sınıfların ve modüllerin hızlı bir şekilde taranması ve gitmeye hazır olacaksınız. Burada öne çıkan bir test projesi örneği de çok iyi. Bulduğum iki ana sorun, ilk olarak sistemimde GLFW3'ü nasıl kurarım ve ikinci olarak bir GLFW3 projesini nasıl kurarım? Bu iki şey belki de uzman olmayan biri için yeterince açık değildir.

Düzenle

Bugün kısaca bir göz attığımda (Tarih: 2014-01-14), GLFW web sitesi son baktığımdan bu yana büyük değişikliklere uğramış gibi görünüyor ve şimdi GLFW'yi derleme ve GLFW ile programları geliştirme konusunda yeni olduğunu düşündüğüm bir bölüm var.


Bunu buraya koyduğunuz için teşekkürler - belli ki bunun için çok iş var. Yine de bunu bir soru ve cevaba bölmek ister misiniz? Kendi sorunuza kendi cevabınızı ekleyebilir ve doğru olarak işaretleyebilirsiniz.
Fraser

@Fraser Evet, bu şekilde daha iyi olacağını düşünüyorsanız elbette
user3728501

1
Ben ikinci oldum. GLFW'yi çok seviyorum ama Mac vb. Altında v3'ün nasıl derleneceğine dair herhangi bir belge bulamamaktan gerçekten hüsrana uğradım
user18490

1
@ user18490 Evet, GLFW "daha iyi bir bolluk" gibi göründüğü için bu tür bir şaşırtıcı buldum. Eminim belgelerinde bolluğun sadece öğrenmek için iyi olduğunu ve profesyonel bir pencere kitaplığı istiyorsanız GLFW'yi kullanın. Yani şaşırtıcı olan şey, size ne kadar iyi olduğunu söylüyorlar ama nasıl kuracağınızı söylemiyorlar! (
SFML'den

@Edward Kuş. : Sonunda bazı GLFW yüklemeden ilgili bu web sayfası hakkında faydalı bilgiler bulunmaktadır scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/...
user18490

Yanıtlar:


130

Adım 1: GLFW 3'ü CMAKE ile sisteminize kurma

Bu kurulum için KUbuntu 13.04, 64bit kullanıyordum.

İlk adım, en son sürümü (gelecekteki sürümlerin benzer şekilde çalıştığını varsayarak) www.glfw.org adresinden , muhtemelen bu bağlantıyı kullanarak indirmektir .

Bir sonraki adım, arşivi çıkarmak ve bir terminal açmaktır. cdglfw-3.XX dizinine girin ve çalıştırın cmake -G "Unix Makefiles", yükseltilmiş ayrıcalıklara ihtiyacınız olabilir ve ayrıca önce yapı bağımlılıkları kurmanız gerekebilir . Bunu yapmak için , benim kullandığım gibi , deneyin sudo apt-get build-dep glfw ya sudo apt-get build-dep glfw3 da elle yapınsudo apt-get install cmake xorg-dev libglu1-mesa-dev ... pthread kitaplıkları gibi ihtiyaç duyduğunuz başka kitaplıklar da olabilir ... Görünüşe göre zaten bende vardı. (Aşağıda, g ++ bağlayıcı aşamasına verilen -l seçeneklerine bakın.)

Şimdi yazabilir makeve sonra yazabilirsiniz make install, bu muhtemelen sudoilk önce yapmanızı gerektirecektir .

Tamam, son üç CMake aşamasında, size neyin inşa edildiğini veya nereye yerleştirildiğini söyleyen bazı ayrıntılı çıktılar almalısınız. ( /usr/includeÖrneğin.)

Adım 2: Bir test programı oluşturun ve derleyin

Bir sonraki adım vim'i ("ne ?! vim ?!" diyorsunuz) veya tercih ettiğiniz IDE / metin düzenleyiciyi ateşlemek ... vim kullanmadım, Kate kullandım çünkü KUbuntu 13.04'teyim ... Her neyse, test programını buradan indirin veya kopyalayın (sayfanın alt kısmında) ve kaydedin, çıkın.

Şimdi kullanarak derleyin g++ -std=c++11 -c main.cpp- c ++ 11'in gerekli olup olmadığından emin değilim ama ben öyle kullandım nullptr, ona ihtiyacım vardı ... gcc'nizi sürüm 4.7'ye veya gelecek sürüm 4.8'e yükseltmeniz gerekebilir ... Bununla ilgili bilgi burada .

Ardından programı elle yazdıysanız veya "çok akıllı" olmaya çalıştıysanız ve bir şey işe yaramadıysa, hatalarınızı düzeltin ... Sonra bu canavarı kullanarak onu bağlayın! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiGördüğünüz gibi, "kurulum bağımlılıklarını kurun" bölümünde, GL, GLU, X11 Xxf86vm (her ne olursa olsun) Xrandr posix-thread ve Xi (her ne ise) geliştirme kitaplıklarının da kurulu olduğunu kontrol etmek isteyebilirsiniz . Belki grafik sürücülerinizi de güncelleyin, GLFW 3'ün OpenGL sürüm 3 veya üzeri gerektirebileceğini düşünüyorum. Belki birisi bunu doğrulayabilir? (@ User2255242'ye atıfta bulunun) -ldl -lXinerama -lXcursortanımlanmamış referanslar alıyorsanız, düzgün çalışmasını sağlamak için bağlayıcı seçeneklerini de eklemeniz gerekebilir dlclose.

Ve evet, gerçekten o kadar çok -ls'ye ihtiyacım vardı !

3. Adım: Bitirdiniz, iyi günler!

Umarım bu bilgiler doğruydu ve her şey sizin için işe yaradı ve GLFW test programını yazmaktan zevk aldınız. Ayrıca umarım bu rehber yardımcı oldu, ya da yardımcı olacaktır, I olarak mücadele vardı gelecekte birkaç kişi oldu bugün dün!

Bu arada, tüm etiketler, stackoverflow'da var olmayan bir cevabı ararken aradıklarım. (Şimdiye kadar.) Umarım benimle benzer bir konumda olsaydın, aradığın şey bunlar olur.

Yazar Notu:

Bu iyi bir fikir olmayabilir. Bu yöntem (sudo make install kullanarak) sisteminize zarar verebilir. (Bkz.Debian'ı Kırma)

İdeal olarak, ben veya bir başkası, lib dosyalarını vb. Sistem varsayılan dizinlerine yüklemeyen bir çözüm önermeliyiz, çünkü bunlar gibi paket yöneticileri tarafından yönetilmelidir aptve bunu yapmak bir çatışmaya neden olabilir ve paket yönetim sisteminizi bozabilir.

Alternatif bir çözüm için yeni "2020 cevabına" bakın.


Bunu anlamaya çalışmak için saatler harcadım. Bu cevap benim için çalıştı: Ubuntu 13.04, x64. NetBeans C ++ IDE (Proje Özellikleri-> Oluştur-> Bağlayıcı-> Kitaplıklar-> Seçenek Ekle-> Diğer Seçenek'e bağlayıcı satırını ekleyin - aksi takdirde talimatları aynen izleyin)
Scott Drew

Görünüşe göre (GLFW 3.0.3 ile) bir şey kullanıyor, powbu yüzden -lmderleme seçeneklerine eklemek onu düzeltti.
Forest Katsch

1
Edward, teşekkürler. Tüm -l gereksinimlerinin sadece yanlış bir şey yaptığım anlamına gelmediğine dair bu akıl sağlığı kontrolüne ihtiyacım vardı.
wrongu

3
dostum sen bir fu **** DAHİSİN !!!! 3 saatin var, bunu yapmaya çalışan 3 günüm var (aslında nereden başlayacağımı araştırıyorum, bolluk tarihini okuyorum, her neyse) teşekkür ederim çok teşekkürler; Ayrıca, glfw sayfasını okuduğumu, eğitimlerini takiben işi yapamadığımı, bunu bulduğumda neredeyse vazgeçtiğimi ve sizin kadar basit ve doğrudan açıklamadıklarını da tavsiye etmek isterim. burada yaptın harika iş !!
Victor R. Oliveira

1
Temiz bir Linux Mint üzerinde şu paketleri sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
kurmam gerekiyordu

18

Bu şekilde çözdüm

Bir pkg-config dosyası, bir kitaplığı kullanmak için gereken tüm gerekli derleme zamanı ve bağlantı zamanı bayraklarını ve bağımlılıkları tanımlar.

pkg-config --static --libs glfw3

bana bunu gösteriyor

-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  

Tüm bu kitapların derlemek için gerçekten gerekli olup olmadığını bilmiyorum ama benim için işe yarıyor ...


3
Bu cevap mutlaka görülmeli. Daha önce pkg-config hakkında bir bilgim yoktu. Ancak bugünden sonuna kadar kullanacağım, çünkü her türlü bağlantı bağımlılığı sorununu çözmeme yardımcı olacak. Harika bir cevap için teşekkürler.
Sayan Bhattacharjee

18

-lGlfw BUILD_SHARED_LIBSseçeneğini seçenekle kurarsanız, bu kadar çok URL'ye ihtiyacınız olmadığını unutmayın . (Bu seçeneği önce çalıştırarak etkinleştirebilirsiniz ccmake).

Bu yol sudo make install, paylaşılan kitaplığı içine yükleyecektir /usr/local/lib/libglfw.so. Daha sonra örnek dosyayı basit bir şekilde derleyebilirsiniz:

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

Öyleyse, programınızı çalıştırmadan önce paylaşılan kitaplıklar için arama yoluna / usr / local / lib / eklemeyi unutmayın. Bu, şu şekilde yapılabilir:

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

Ve bunu içine koyabilirsin, ~/.bashrcböylece her zaman yazmak zorunda kalmazsın.


1
bu bilgi, derlemek ve çalıştırmak için terminal kullanmak yerine bir IDE kurmak isteyenler için gerçekten önemlidir; Bunun nasıl yapılacağı hakkında daha fazla ayrıntı verebilir misiniz? Denedim ama hiç başarılı
Victor R. Oliveira

Noob burada! Bunun biraz eski olduğunu biliyorum ama bana gerçekten yardımcı oldu. Birisi, paylaşılan bir kitaplığı kullanmanın onu neden yapacağını açıklayabilir (veya birisine bağlantı kurabilir), böylece çoğu aynı zamanda paylaşılan nesne dosyaları olan diğer tüm kitaplıkları birbirine bağlamak zorunda kalmayız? Ayrıca, derledikten sonra LD_LIBRARY_PATH değişkenini ayarlamam veya yeni derlenmiş çalıştırılabilir dosyamı çalıştırmaya çalıştığımda gnu hatalarının gazabıyla yüzleşmem gerekiyordu.
Sammaron

1
Merhaba Sammaron, LD_LIBRARY_PATH hakkında konuştuğunuz için teşekkürler, cevabımı bunu içerecek şekilde güncelleyeceğim. Glfw kütüphanesini kullanırken diğer tüm kütüphaneleri belirtmeniz gerekmemesinin nedeni, glfw'nin bunları zaten yüklemesidir. lddBir program çalışırken hangi kitaplıkların yüklendiğini kontrol etmek için komutu kullanabilirsiniz . Ayrıca, kitaplıkların doğru bir şekilde bulunup bulunmadığını kontrol etmenin de iyi bir yoludur. lddKarşılaştırmak için programınızda ve /usr/local/lib/libglfw.so üzerinde kullanabilirsiniz .
CastleDefender

Yanıt için teşekkürler! Ayrıca, kendimi biraz düzeltmek istedim: LD_LIBRARY_PATH değişkeni uygulanabilir bir çözüm, ancak kitaplık, yükleyicinin yine de sudo ldconfigarayacağı standart yola kurulmuşsa, çalıştırmak bu sorunu çözmeli ve LD_LIBRARY_PATH'in yapılandırılmasını gerektirmemelidir her zaman. Bu cevap , bunun neden tercih edilebileceğine dair bir tartışma sağlar.
Sammaron

Paylaşılan derlemeyi yaptıktan sonra, diğer 2 kişiyi derlemek / bağlamak zorunda kaldım. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL benim için çalıştı.
Sridhar Thiagarajan

9

Kabul edilen yanıt daha fazla düzenlemeye izin vermediğinden, bunu tek bir kopyala-yapıştır komutuyla özetleyeceğim (3.2.1'i ilk satırda bulunan en son sürümle değiştirin):

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

Bir programı derlemek istiyorsanız aşağıdaki komutları kullanın:

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 eğitimini takip ediyorsanız, GLAD'ı da kurmanız gerekebilir. Böyle bir durumda bu bağlantıya tıklayın

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

ve ardından web sitesinin sağ alt köşesindeki "Oluştur" düğmesini tıklayın ve zip dosyasını indirin. Çıkarın ve kaynakları aşağıdaki komutla derleyin:

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

Şimdi, programınızı derlemek için komutlar şöyle olur:

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
Parlak! Benim için GLFW v3.2.1 ile Ubuntu 16.04'te çalıştı. Yalnızca iki küçük düzeltme: set version = XXX basitçe version = "XXX" olmalı ve bu satırın sonunda .zip olmamalıdır: cd glfw - $ {version} .zip
Tim

3

2020 Güncellenmiş Cevap

2020 (7 yıl sonra) ve bu süre zarfında Linux hakkında daha fazla şey öğrendim. Özellikle sudo make install, paket yönetim sistemine müdahale edebileceğinden, kitaplıkları kurarken çalıştırmanın iyi bir fikir olmayabileceği. (Bu durumda aptDebian 10 kullandığım için)

Bu doğru değilse, lütfen yorumlarda beni düzeltin.

Alternatif önerilen çözüm

Bu bilgiler GLFW belgelerinden alınmıştır, ancak Linux kullanıcılarıyla ilgili bilgileri genişlettim / düzenledim.

  • Ana dizine gidin ve github'dan glfw deposunu klonlayın
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • Bu noktada bir inşa dizini oluşturabilir ve buradaki talimatları uygulayabilirsiniz ( glfw build talimatları ), ancak ben bunu yapmamayı seçtim. Aşağıdaki komut 2020'de hala çalışıyor gibi görünüyor, ancak glfw çevrimiçi talimatlarında açıkça belirtilmemiştir.
cmake -G "Unix Makefiles"
  • sudo apt-get build-dep glfw3(?) Öncesinde koşmanız gerekebilir . Hem bu komutu hem sudo apt install xorg-devde talimatlara göre çalıştırdım.

  • Sonunda koş make

  • Şimdi proje dizininizde aşağıdakileri yapın. (Glfw kitaplıklarını kullanan projenize gidin)

  • Bir yarat CMakeLists.txt, benimki böyle görünüyor

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'den hoşlanmıyorsanız özür dilerim ama bence projenizi hızlı bir şekilde çalıştırmanın en kolay yolu bu. En azından temel düzeyde kullanmayı öğrenmenizi tavsiye ederim. Maalesef iyi bir CMake öğreticisi bilmiyorum

  • Sonra yapın cmake .ve makeprojeniz oluşturulmalı ve glfw3 paylaşılan lib'ye bağlanmalıdır.

  • Dinamik bağlantılı kitaplık oluşturmanın bir yolu vardır. Burada statik yöntemi kullandığıma inanıyorum. Benden daha fazlasını biliyorsanız, lütfen aşağıdaki bu cevaba yorum yapın / bir bölüm ekleyin

  • Bu, diğer sistemlerde çalışmalı, eğer bana haber vermezsem ve yapabiliyorsam yardımcı olacağım


2

Harika rehber, teşekkürler. Buradaki talimatların çoğuna göre, neredeyse benim için oluşturuldu, ancak kalan bir hatam vardı.

/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

Bu hatayı aradıktan sonra -ldlkomut satırına eklemem gerekiyordu.

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

Sonra "merhaba GLFW" örnek uygulaması derlendi ve bağlandı.

Linux'ta oldukça yeniyim, bu yüzden bu ekstra kütüphanenin tam olarak ne yaptığından tam olarak emin değilim ... bağlantı hatamı düzeltmek dışında. Bununla birlikte, yukarıdaki gönderide bu cmd satır anahtarını görüyorum.


.O ve .exec dosyam var .. lütfen bana yardım et, nasıl çalıştırırım?
Buddhika Chaturanga

0

Eğer birisi tembelleşiyorsa ve belki de tüm bu kitaplıklar ve -l s için kabuğu nasıl yapılandıracağını bilmiyorsa , o zaman kolayca derlemenizi sağlayan bir python betiği oluşturdum (python3'e sahip olmanız gerekir, çoğu linux kullanıcısı vardır.) komut dosyaları yazıp onları fazla endişelenmeden çalıştırın, sadece düzenli sistem çağrıları var, sadece düzgün bir şekilde düzenlenmiş, onu kendim için yarattım ama belki faydalı olabilir: İşte burada


0

İyi tanımlanmış cevap zaten orada, ancak bu KISA tarifi uyguladım :

  1. Linuxbrew'u yükleyin
  2. $ brew install glfw
  3. cd /home/linuxbrew/.linuxbrew/Cellar/glfw/X.X/include
  4. sudo cp -R GLFW /usr/include

Açıklama: GLFW'yi Linuxbrew (sevilen Homebrew'in Linux portu) tarafından yapılan CMAKE ile oluşturmayı başarıyoruz. Sonra üstbilgi dosyalarını Linux'un okuduğu yere ( /usr/include) kopyalayın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.