Cách xây dựng và cài đặt GLFW 3 và sử dụng nó trong một dự án Linux


95

GLFW3

Đêm qua tôi đã làm việc muộn để cố gắng xây dựng gói GLFW 3 cho Linux từ nguồn. Quá trình này khiến tôi mất một khoảng thời gian rất dài, tổng cộng khoảng 3 giờ, một phần vì tôi không quen với CMake, và một phần vì tôi chưa quen với GLFW.

Tôi hy vọng rằng bài đăng này sẽ cứu bạn khỏi khó khăn mà tôi đã gặp phải ngày hôm qua! Tôi nghĩ tôi nên viết một đoạn ngắn, và hy vọng sẽ giúp bạn tiết kiệm được vài giờ trong đời ...

Nhờ "urraka", "b6" và "niklas" trên kênh #glfw IRC, tôi đã có thể làm cho phiên bản glfw 3.0.1 hoạt động.

Hóa ra đây không phải là một quá trình tầm thường (chắc chắn không phải đối với tôi, tôi không phải là chuyên gia) vì không có nhiều tài liệu trên web về glfw3, đặc biệt là về cách thiết lập nó với CMake.

Tôi được yêu cầu chia phần này thành một phần câu hỏi và câu trả lời, và vì vậy tôi đã thực hiện điều đó, và phần câu trả lời hiện ở bên dưới.

Bạn có phải là người duy trì GLFW hay là thành viên của nhóm GLFW không?

Nếu bất kỳ nhà bảo trì nào của GLFW3 thấy điều này, thì thông điệp của tôi cho họ là vui lòng thêm phần "thiết lập GLFW3 trên Windows, Mac OS X và Linux" vào trang web của bạn! Khá dễ dàng để viết chương trình với GLFW, vì tài liệu trực tuyến khá tốt, bạn có thể quét nhanh tất cả các lớp và mô-đun có sẵn và bạn sẽ sẵn sàng sử dụng. Ví dụ về một dự án thử nghiệm được nêu ở đây cũng rất tốt. Hai vấn đề chính mà tôi tìm thấy là, thứ nhất là làm cách nào để thiết lập GLFW3 trên hệ thống của mình và thứ hai là làm cách nào để xây dựng một dự án GLFW3? Hai điều này có lẽ không đủ rõ ràng đối với một người không chuyên.

Biên tập

Hôm nay có một cái nhìn ngắn gọn (Ngày: 2014-01-14), có vẻ như trang web GLFW đã trải qua những thay đổi nặng nề kể từ lần cuối tôi xem và bây giờ có một phần về biên dịch GLFW và các chương trình bắt nạt với GLFW, mà tôi nghĩ là mới.


Cảm ơn vì đã đưa nó lên đây - rõ ràng là rất nhiều việc đã phải làm. Bạn có phiền khi chia nó thành một câu hỏi và câu trả lời không? Bạn có thể thêm câu trả lời của riêng mình cho câu hỏi của riêng bạn và đánh dấu nó là đúng.
Fraser

@Fraser Có tất nhiên nếu bạn nghĩ rằng nó sẽ được tốt hơn theo cách đó
user3728501

1
Tôi thứ hai đó. Tôi như GLFW rất nhiều nhưng đã thực sự thất vọng không tìm thấy bất kỳ tài liệu liên quan như thế nào để biên dịch v3 dưới Mac vv
user18490

1
@ user18490 Vâng, tôi thấy điều đó thật đáng ngạc nhiên, vì GLFW dường như là "một loại thực phẩm tốt hơn". Tôi chắc chắn rằng họ đã đề cập trong tài liệu của họ rằng gluten chỉ tốt cho việc học và nếu bạn muốn có một window lib chuyên nghiệp, hãy sử dụng GLFW. Vì vậy, điều đáng ngạc nhiên là họ cho bạn biết nó tốt như thế nào nhưng lại không cho bạn biết cách cài đặt nó! (Khá giống SFML)
user3728501

@Edward Bird. Cuối cùng tôi đã tìm thấy một số thông tin hữu ích trên trang web này liên quan đến cài đặt GLFW: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/...
user18490

Câu trả lời:


125

Bước 1: Cài đặt GLFW 3 trên hệ thống của bạn với CMAKE

Đối với cài đặt này, tôi đang sử dụng KUbuntu 13.04, 64bit.

Bước đầu tiên là tải xuống phiên bản mới nhất (giả sử các phiên bản trong tương lai hoạt động theo cách tương tự) từ www.glfw.org , có thể bằng liên kết này .

Bước tiếp theo là giải nén kho lưu trữ và mở một thiết bị đầu cuối. cdvào thư mục glfw-3.XX và chạy, cmake -G "Unix Makefiles"bạn có thể cần các đặc quyền nâng cao, và bạn cũng có thể cần cài đặt các phụ thuộc bản dựng trước . Để làm điều này, hãy thử sudo apt-get build-dep glfw hoặc sudo apt-get build-dep glfw3 hoặc làm theo cách thủ công , như tôi đã sử dụng sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Có thể có các lib khác mà bạn yêu cầu chẳng hạn như các thư viện pthread ... Rõ ràng là tôi đã có chúng rồi. (Xem các tùy chọn -l được cung cấp cho giai đoạn trình liên kết g ++ bên dưới.)

Bây giờ bạn có thể nhập makevà sau đó make install, có thể bạn sẽ phải nhập sudotrước.

Được rồi, bạn sẽ nhận được một số đầu ra dài dòng về ba giai đoạn CMake cuối cùng, cho bạn biết những gì đã được xây dựng hoặc nơi nó đã được đặt. ( /usr/includeVí dụ: trong.)

Bước 2: Tạo chương trình thử nghiệm và biên dịch

Bước tiếp theo là kích hoạt vim (bạn nói "cái gì ?! vim ?!") hoặc trình soạn thảo văn bản / IDE ưa thích của bạn ... Tôi không sử dụng vim, tôi đã sử dụng Kate, vì tôi đang sử dụng KUbuntu 13.04 ... Dù sao, hãy tải xuống hoặc sao chép chương trình thử nghiệm từ đây (ở cuối trang) và lưu, thoát.

Bây giờ biên dịch bằng cách sử dụng g++ -std=c++11 -c main.cpp- không chắc liệu c ++ 11 có được yêu cầu hay không nhưng tôi đã sử dụng nullptrnhư vậy, tôi cần nó ... Bạn có thể cần nâng cấp gcc của mình lên phiên bản 4.7 hoặc phiên bản 4.8 sắp tới ... Thông tin về điều đó tại đây .

Sau đó, sửa lỗi của bạn nếu bạn gõ chương trình bằng tay hoặc cố gắng "quá thông minh" và một cái gì đó không hoạt động ... Sau đó liên kết nó bằng cách sử dụng con quái vật này! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiVì vậy, bạn thấy đó, trong phần "cài đặt phụ thuộc bản dựng", bạn cũng có thể muốn kiểm tra xem bạn đã cài đặt thư viện phát triển GL, GLU, X11 Xxf86vm (bất cứ điều gì) Xrandr posix-thread và Xi (bất cứ điều gì đó) . Có thể cập nhật trình điều khiển đồ họa của bạn quá, tôi nghĩ GLFW 3 có thể yêu cầu OpenGL phiên bản 3 hoặc cao hơn? Có lẽ ai đó có thể xác nhận điều đó? Bạn cũng có thể cần thêm các tùy chọn trình liên kết -ldl -lXinerama -lXcursorđể làm cho nó hoạt động chính xác nếu bạn đang nhận được các tham chiếu không xác định đến dlclose(tín dụng cho @ user2255242).

Và, vâng, tôi thực sự cần rất nhiều -l!

Bước 3: Bạn đã hoàn thành, chúc một ngày tốt lành!

Hy vọng rằng thông tin này là chính xác và mọi thứ đều hiệu quả với bạn, và bạn rất thích viết chương trình thử nghiệm GLFW. Cũng hy vọng rằng hướng dẫn này đã giúp, hoặc sẽ giúp được một vài người trong tương lai, những người đang gặp khó khăn như tôi ngày hôm qua!

Nhân tiện, tất cả các thẻ là những thứ tôi đã tìm kiếm trên stackoverflow để tìm kiếm câu trả lời không tồn tại. (Cho đến bây giờ.) Hy vọng rằng chúng là những gì bạn tìm kiếm nếu bạn ở vị trí tương tự như tôi.

Tác giả Lưu ý:

Đây có thể không phải là một ý kiến ​​hay. Phương pháp này (sử dụng sudo make install) có thể gây hại cho hệ thống của bạn. (Xem Đừng phá vỡ Debian)

Tốt nhất là tôi hoặc ai đó nên đề xuất một giải pháp không chỉ cài đặt các tệp lib, v.v. vào các thư mục mặc định của hệ thống vì chúng phải được quản lý bởi các trình quản lý gói apt, và làm như vậy có thể gây ra xung đột và phá vỡ hệ thống quản lý gói của bạn.

Xem "câu trả lời năm 2020" mới để biết giải pháp thay thế.


Tôi đã dành hàng giờ để tìm ra điều này. Câu trả lời này phù hợp với tôi: Ubuntu 13.04, x64. NetBeans C ++ IDE (thêm dòng trình liên kết trong Thuộc tính dự án-> Xây dựng-> Trình liên kết-> Thư viện-> Thêm tùy chọn-> Tùy chọn khác - nếu không hãy làm theo hướng dẫn nguyên văn)
Scott Drew

Rõ ràng (với GLFW 3.0.3) có thứ gì đó sử dụng pownên việc thêm -lmvào các tùy chọn biên dịch đã sửa nó.
Forest Katsch

1
Edward, cảm ơn. Tôi cần kiểm tra sự tỉnh táo này để đảm bảo rằng tất cả các yêu cầu -l không chỉ có nghĩa là tôi đã làm sai.
falseu

3
anh bạn là một fu **** GENIUS !!!! bạn có 3 giờ, tôi có 3 ngày để cố gắng làm việc này (thực sự là nghiên cứu từ đâu để bắt đầu, đọc về lịch sử gluten, v.v.) cảm ơn bạn, cảm ơn bạn rất nhiều; Tôi cũng muốn có lời khuyên rằng tôi đọc trang glfw, không thể thực hiện công việc theo hướng dẫn của họ, gần như bỏ cuộc khi tôi tìm thấy điều này và họ không giải thích đơn giản và trực tiếp như bạn làm. công việc tuyệt vời bạn đã làm ở đây !!
Victor R. Oliveira

1
Trên Linux Mint sạch tôi phải cài đặt các gói:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
LENAR Hoyt

18

Tôi đã giải quyết nó theo cách này

Tệp pkg-config mô tả tất cả các cờ thời gian biên dịch và thời gian liên kết cần thiết và các phụ thuộc cần thiết để sử dụng thư viện.

pkg-config --static --libs glfw3

cho tôi thấy điều đó

-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ôi không biết liệu tất cả các lib này có thực sự cần thiết cho việc biên dịch hay không nhưng đối với tôi, nó hoạt động ...


3
Câu trả lời này là phải xem. Tôi không biết về pkg-config trước đó. Nhưng từ hôm nay tôi sẽ sử dụng nó cho đến hết, bởi vì nó sẽ giúp tôi giải quyết bất kỳ loại vấn đề phụ thuộc liên kết nào. Cảm ơn vì một câu trả lời tuyệt vời như vậy.
Sayan Bhattacharjee

18

Lưu ý rằng bạn không cần nhiều -lnhư vậy nếu bạn cài đặt glfw với BUILD_SHARED_LIBStùy chọn. (Bạn có thể bật tùy chọn này bằng cách chạy ccmaketrước).

Cách này sudo make installsẽ cài đặt thư viện được chia sẻ trong /usr/local/lib/libglfw.so. Sau đó, bạn có thể biên dịch tệp ví dụ với một tệp đơn giản:

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

Sau đó, đừng quên thêm / usr / local / lib / vào đường dẫn tìm kiếm các thư viện được chia sẻ trước khi chạy chương trình của bạn. Điều này có thể được thực hiện bằng cách sử dụng:

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

Và bạn có thể đặt nó vào của bạn ~/.bashrcđể bạn không phải gõ nó mọi lúc.


1
thông tin này thực sự quan trọng đối với những người muốn thiết lập một IDE thay vì sử dụng thiết bị đầu cuối để biên dịch và chạy; Bạn có thể cung cấp thêm chi tiết về cách làm điều này? Tôi đã cố gắng nhưng không thành công ở tất cả
Victor R. Oliveira

Noob đây! Tôi biết điều này là một chút cũ, nhưng nó thực sự giúp tôi. Ai đó có thể giải thích (hoặc liên kết với ai đó giải thích) tại sao sử dụng thư viện được chia sẻ sẽ khiến chúng ta không phải liên kết tất cả các thư viện khác đó, nhiều thư viện trong số đó cũng là tệp đối tượng được chia sẻ không? Ngoài ra, tôi phải đặt biến LD_LIBRARY_PATH sau khi biên dịch hoặc đối mặt với sự phẫn nộ của lỗi gnu khi tôi cố gắng chạy tệp thực thi mới được biên dịch của mình.
Sammaron

1
Xin chào Sammaron, cảm ơn bạn đã nói về LD_LIBRARY_PATH, tôi sẽ cập nhật câu trả lời của mình để bao gồm điều này. Lý do bạn không phải chỉ định tất cả các thư viện khác khi sử dụng thư viện glfw là vì glfw đã tải chúng. Bạn có thể sử dụng lệnh lddđể kiểm tra những thư viện nào được tải bởi một chương trình khi nó chạy. Nó cũng là một cách tốt để kiểm tra xem các thư viện đã được tìm thấy đúng chưa. Bạn có thể sử dụng lddtrên chương trình của mình và trên /usr/local/lib/libglfw.so để so sánh.
CastleDefender

Cảm ơn vi đa trả lơi! Ngoài ra, tôi muốn sửa lại bản thân mình một chút: biến LD_LIBRARY_PATH là một giải pháp khả thi, nhưng nếu thư viện đã được cài đặt trong đường dẫn chuẩn mà trình tải vẫn đang tìm kiếm thì việc chạy sudo ldconfigsẽ giải quyết được vấn đề này và không yêu cầu LD_LIBRARY_PATH được định cấu hình mỗi lần. Câu trả lời này cung cấp một cuộc thảo luận tại sao điều này có thể được ưu tiên.
Sammaron

Sau khi làm với bản dựng được chia sẻ, tôi đã phải biên dịch / liên kết 2 người khác. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL đã làm việc cho tôi.
Sridhar Thiagarajan

9

Vì câu trả lời được chấp nhận không cho phép chỉnh sửa nhiều hơn, tôi sẽ tóm tắt nó bằng một lệnh sao chép-dán (Thay thế 3.2.1 bằng phiên bản mới nhất có sẵn trong dòng đầu tiên):

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

Nếu bạn muốn biên dịch một chương trình, hãy sử dụng các lệnh sau:

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

Nếu bạn đang làm theo hướng dẫn của learningnopengl.com, bạn cũng có thể phải thiết lập GLAD. Trong trường hợp đó, hãy nhấp vào liên kết này

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

và sau đó nhấp vào nút "Tạo" ở góc dưới cùng bên phải của trang web và tải xuống tệp zip. Giải nén nó và biên dịch các nguồn bằng lệnh sau:

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

Bây giờ, các lệnh để biên dịch chương trình của bạn trở thành như sau:

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
Xuất sắc! Đã làm việc cho tôi trên Ubuntu 16.04 với GLFW v3.2.1. Chỉ có hai sự điều chỉnh nhỏ: bộ phiên bản = XXX nên chỉ đơn giản là version = "XXX" và không nên có .zip ở phần cuối của dòng này: cd glfw - $ {version} .zip
Tim

2

Hướng dẫn tuyệt vời, cảm ơn bạn. Với hầu hết các hướng dẫn ở đây, nó gần như được xây dựng cho tôi nhưng tôi vẫn gặp một lỗi còn lại.

/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

Sau khi tìm kiếm lỗi này, tôi đã phải thêm -ldlvào dòng lệnh.

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

Sau đó, ứng dụng mẫu "xin chào GLFW" được biên dịch và liên kết.

Tôi còn khá mới với linux vì vậy tôi không hoàn toàn chắc chắn chính xác thư viện bổ sung này làm gì ... ngoài việc sửa lỗi liên kết của tôi. Tuy nhiên, tôi thấy rằng chuyển đổi dòng cmd trong bài viết trên.


Tôi có tệp .o và .exec .. vui lòng giúp tôi với, làm thế nào để chạy nó?
Buddhismka Chaturanga

0

Nếu ai đó lười biếng và có lẽ không biết cách định cấu hình shell cho tất cả các thư viện và -l đó, thì tôi đã tạo một tập lệnh python (bạn phải có python3, hầu hết người dùng linux đều có nó.) Cho phép bạn dễ dàng biên dịch tập lệnh và chạy chúng mà không cần lo lắng nhiều, nó chỉ có các lệnh gọi hệ thống thông thường, chỉ được sắp xếp gọn gàng, tôi đã tạo nó cho riêng mình nhưng có lẽ nó sẽ hữu ích: Đây là


0

Câu trả lời được mô tả rõ ràng đã có, nhưng tôi đã xem qua công thức NGẮN HẠN này :

  1. Cài đặt Linuxbrew
  2. $ brew install glfw
  3. cd /home/linuxbrew/.linuxbrew/Cellar/glfw/X.X/include
  4. sudo cp -R GLFW /usr/include

Giải thích: Chúng tôi quản lý để xây dựng GLFW bằng CMAKE được thực hiện bởi Linuxbrew (cổng Linux của Homebrew yêu quý). Sau đó, sao chép các tệp tiêu đề vào nơi Linux đọc từ ( /usr/include).


0

Câu trả lời cập nhật năm 2020

Đó là năm 2020 (7 năm sau) và tôi đã tìm hiểu thêm về Linux trong thời gian này. Cụ thể là chạy sudo make installkhi cài đặt các thư viện có thể không phải là một ý kiến ​​hay vì chúng có thể ảnh hưởng đến hệ thống quản lý gói. (Trong trường hợp này aptvì tôi đang sử dụng Debian 10.)

Nếu điều này không chính xác, xin vui lòng sửa cho tôi trong phần bình luận.

Giải pháp đề xuất thay thế

Thông tin này được lấy từ các tài liệu GLFW, tuy nhiên tôi đã mở rộng / sắp xếp hợp lý thông tin có liên quan đến người dùng Linux.

  • Đi tới thư mục chính và sao chép kho lưu trữ glfw từ github
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • Tại thời điểm này, bạn có thể tạo một thư mục xây dựng và làm theo hướng dẫn tại đây ( hướng dẫn xây dựng glfw ), tuy nhiên tôi đã chọn không làm điều đó. Lệnh sau có vẻ vẫn hoạt động vào năm 2020 tuy nhiên nó không được hướng dẫn trực tuyến glfw nêu rõ ràng.
cmake -G "Unix Makefiles"
  • Bạn có thể cần chạy sudo apt-get build-dep glfw3trước (?). Tôi đã chạy cả lệnh này và sudo apt install xorg-devtheo hướng dẫn.

  • Cuối cùng là chạy make

  • Bây giờ trong thư mục dự án của bạn, hãy làm như sau. (Đi tới dự án của bạn sử dụng glfw libs)

  • Tạo một CMakeLists.txt, của tôi trông như thế này

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)
  • Nếu bạn không thích CMake thì tôi xin phép nhưng theo tôi đó là cách dễ nhất để dự án của bạn hoạt động nhanh chóng. Tôi khuyên bạn nên học cách sử dụng nó, ít nhất là ở mức cơ bản. Rất tiếc, tôi không biết bất kỳ hướng dẫn CMake tốt nào

  • Sau đó, làm cmake .make, dự án của bạn sẽ được xây dựng và liên kết với glfw3 shared lib

  • Có một số cách để tạo lib liên kết động. Tôi tin rằng tôi đã sử dụng phương pháp tĩnh ở đây. Vui lòng bình luận / thêm một phần trong câu trả lời này bên dưới nếu bạn biết nhiều hơn tôi

  • Điều này sẽ hoạt động trên các hệ thống khác, nếu không, hãy cho tôi biết và tôi sẽ giúp đỡ nếu tôi có thể

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.