如何构建和安装GLFW 3,并在Linux项目中使用它

113

GLFW3

昨晚我加班很晚,试图从源代码构建Linux的GLFW 3软件包。 这个过程花了我非常长的时间,总共约3个小时,部分原因是我不熟悉CMake,部分原因是我不熟悉GLFW。

我希望这篇文章能够让你免受我昨天的困难! 我认为我应该写一个简短的介绍,并希望能够节省您几个小时的生命......

感谢 #glfw IRC频道上的“urraka”,“b6”和“niklas”,我已经成功地让glfw版本3.0.1运行起来。

事实证明,这不是一个微不足道的过程(对我来说肯定不是,我不是专家),因为关于glfw3的文档不多,特别是有关使用CMake进行设置的文档。

有人要求我把它分成问题和答案部分,所以我已经这样做了,答案部分现在在下面。

你是GLFW的维护者或GLFW团队成员吗?

如果GLFW3的任何维护者看到了这个消息,那么我的信息就是请在您的网站上添加一个“设置GLFW3在Windows,Mac OS X和Linux上”的部分! 使用GLFW编写程序相当容易,因为在线文档相当不错,快速扫描所有可用的类和模块,您就可以开始了。 这里展示的测试项目示例也非常好。 我发现的两个主要问题是,首先我如何在我的系统上设置GLFW3,其次我如何构建GLFW3项目? 对于非专家来说,这两件事可能不太清楚。

编辑

今天简要查看了一下(日期:2014-01-14),似乎GLFW网站自我上次查看以来经历了大量变化,现在有一个有关编译GLFW和使用GLFW构建程序的部分,我认为这些都是新的。


谢谢您在这里发布这个 - 显然已经付出了很多工作。不过,您介意把它分成问题和答案吗?您可以添加自己的答案到您自己的问题中,并将其标记为正确的答案。 - Fraser
@Fraser 当然可以,如果你认为那样更好。 - FreelanceConsultant
1
我赞同这个观点。我非常喜欢GLFW,但真的很沮丧,找不到有关如何在Mac下编译v3的任何文档等。 - user18490
1
@user18490 是的,我也觉得很惊讶,因为GLFW似乎是“更好的glut”。 我确定他们在文档中提到,glut只适合学习,如果您想要一个专业的窗口库,请使用GLFW。 所以令人惊讶的是,他们告诉您它有多好,但不告诉您如何安装它! (这与SFML非常不同) - FreelanceConsultant
我会考虑添加那个。 - elmindreda
显示剩余3条评论
10个回答

151

步骤 1:使用 CMAKE 在系统上安装 GLFW 3

本次教程是在 KUbuntu 13.04 64 位上进行的。

首先,从www.glfw.org下载最新版本(假设未来版本的操作方式类似),可以使用这个链接

接下来,解压归档文件并打开终端。cd进入glfw-3.X.X目录并运行cmake -G"Unix Makefiles",您可能需要提升权限,并且还可能需要先安装构建依赖项。要执行此操作,请尝试sudo apt-get build-dep glfwsudo apt-get build-dep glfw3手动执行,就像我使用sudo apt-get install cmake xorg-dev libglu1-mesa-dev一样... 您可能需要其他库,例如pthread库... 显然,我已经安装了它们。(请参见下面给g++链接器阶段给出的-l选项。)

现在,您可以输入make,然后输入make install,这可能需要您首先输入sudo

好的,您应该可以在最后三个CMake阶段获得一些详细的输出,告诉您已经构建了什么或者它们被放置在哪里。(例如,在/usr/include中。)

步骤 2:创建一个测试程序并编译

下一步是启动vim(“什么?!vim?!”你问道),或者你喜欢的IDE/文本编辑器...我没有使用vim,我用的是Kate,因为我在KUbuntu 13.04上...不管怎样,从这里下载或复制测试程序(页面底部),保存并退出。
现在使用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线程和Xi(不知道这是什么)开发库。也许还要更新你的显卡驱动程序,我认为GLFW 3可能需要OpenGL version 3或更高版本?也许有人可以证实一下?如果您得到未定义引用dlclose,您还可能需要添加链接器选项-ldl -lXinerama -lXcursor才能使其正常工作(由@user2255242贡献)。
是的,我确实需要那么多的-l
第三步:您已经完成了,祝您拥有愉快的一天!

作者注:

这可能不是一个好主意。这种方法(使用sudo make install)可能会对您的系统造成风险。(请参见不要破坏Debian)

理想情况下,我或其他人应该提出一种解决方案,它不仅仅将lib文件等安装到系统默认目录中,而是应该由像apt这样的包管理器进行管理,否则这样做可能会导致冲突并破坏您的包管理系统。

请查看新的“2020答案”以获取另一种解决方案。

希望这些信息是正确的,并且一切顺利,您享受了编写GLFW测试程序的过程。同时,希望本指南能够帮助那些像我一样遇到困难的人。

顺便说一句,所有的标记都是我在stackoverflow上寻找没有答案的问题时所搜索的内容。(直到现在为止。)希望如果您和我一样处于类似的位置,那么这些标记就是您所搜索的内容。


我花了数小时来尝试解决这个问题。这个答案对我有用:Ubuntu 13.04,x64。NetBeans C++ IDE(在项目属性->构建->链接器->库->添加选项->其他选项中添加链接器行 - 否则按照原样指示操作)。 - Scott Drew
1
Edward,谢谢。我需要这个理智检查,以确保所有的-l要求并不意味着我做错了什么。 - wrongu
链接时您漏掉了-lrt。 - segfault
3
伙计,你是个天才!!!你用了3个小时,而我试了3天(实际上是在寻找开始的位置、阅读有关 GLUT 历史等方面),谢谢你非常非常多;我还想建议一下,我读了 GLFW 页面,但无法按照他们的教程完成任务,当我发现这个页面时,我几乎要放弃了,因为他们没有像你这样简单直接地解释。你做得很棒!! - Victor Oliveira
1
在一个干净的Linux Mint上,我需要安装这些软件包:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev - Lenar Hoyt
显示剩余13条评论

21

我是用这种方法解决的

一个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

19
注意,如果使用了 BUILD_SHARED_LIBS 选项安装glfw,就不需要那么多的 -l。 (你可以通过首先运行 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
这些信息对于那些想要设置一个IDE而不是使用终端进行编译和运行的人来说非常重要;你能否提供更多关于如何做到这一点的细节?我尝试过但完全没有成功。 - Victor Oliveira
新手报道!我知道这有点老了,但它确实帮助了我。有人能解释一下(或者链接到解释的人)为什么使用共享库会使我们不必链接所有那些其他库,其中许多也是共享对象文件吗?此外,我在编译后必须设置LD_LIBRARY_PATH变量,否则当我尝试运行我的新编译的可执行文件时,就会面临gnu错误的威胁。 - Sammaron
1
嗨,Sammaron,感谢你提到LD_LIBRARY_PATH,我会更新我的答案以包括这个。当使用glfw库时,您不必指定所有其他库的原因是因为glfw已经加载了它们。您可以使用命令“ldd”来检查程序运行时加载了哪些库。这也是检查库是否被正确找到的好方法。您可以在您的程序和/usr/local/lib/libglfw.so上使用“ldd”进行比较。 - CastleDefender
谢谢您的回复!我还想稍微更正一下自己的话:LD_LIBRARY_PATH 变量是一个可行的解决方案,但如果库已经安装在标准路径中,那么运行 sudo ldconfig 就应该可以解决这个问题,而不需要每次都配置 LD_LIBRARY_PATH。这个答案提供了为什么可能更喜欢这种方法的讨论。 - Sammaron
完成构建共享库后,我还需要编译/链接其他两个库。对我来说,g++ main.cpp -L /usr/local/lib/ -lglfw -lGLU -lGL 可以工作。 - Sridhar Thiagarajan

17

2020年更新的答案

现在是2020年(相隔7年),我在这期间学到了更多关于Linux的知识。具体来说,在安装库时运行sudo make install可能不是一个好主意,因为这些库可能会干扰软件包管理系统。(在我的情况下,我使用的是Debian 10的apt。)

如果我这么说不正确,请在评论中纠正我。

提出的替代方案

以下信息取自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-get build-dep glfw3sudo 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共享库

  • 有一些方法可以创建动态链接库。我相信我在这里使用了静态方法。如果您比我更了解,请在下面评论或添加一个部分。

  • 如果这在其他系统上无法工作,请告诉我,我会尽可能提供帮助。


1
2021年更新:如果您遇到像“找不到目标'/usr/lib/libNAME.so'”这样的错误,您必须创建指向问题库的符号链接:sudo ln -s /usr/lib/x86_64-linux-gnu/libNAME.so /usr/lib/libNAME.so - congard
1
我按照GLFW网站上的说明(而不是制作CMakeLists.txt文件)在Linux上进行了操作,它们按预期工作。对于树莓派3 A+ :p,需要另外的步骤。 - Christianidis Vasileios
@ChristianidisVasileios 自我回答这个问题已经过去了10年,而自我回答这个问题已经过去了3年,事情可能已经有了很大的改善。我希望如此。如果情况发生了变化,请发布一个新的回答并提供详细信息。 - FreelanceConsultant

12

由于被接受的答案不允许进行更多的编辑,我将使用单个复制粘贴命令来总结它(将第一行中的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,然后单击网站右下角的“Generate”按钮并下载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一起使用。只有两个小修正:set version=X.X.X应该简单地改为version="X.X.X",并且此行末尾不应该有.zip:cd glfw-${version}.zip - Tim

6

4

非常好的指南,谢谢。按照这里的大多数说明,它 几乎 成功地为我构建了,但我仍然有一个剩余的错误。

/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还很陌生,所以不完全确定这个额外的库到底是做什么的...除了修复我的链接错误。不过我在上面的帖子中看到了命令行开关。


我得到了.o和.exec文件,请帮我,如何运行它? - Buddhika Chaturanga
我认为你可以通过 ./main.exec 执行可执行文件。如果不行,请分享你用来编译代码和生成 .exec 文件的命令。 - HARDY8118

0
如果有人变得懒惰,或者可能不知道如何为所有这些库和-l进行配置,那么我创建了一个Python脚本(您必须拥有Python3,大多数Linux用户都有它),它允许您轻松编译脚本并运行它们而不必担心太多,它只是常规系统调用,整齐地排列,我为自己创建了它,但也许它会有用:在这里

0

已经有一个详细的答案了,但我通过这个更短的步骤:

  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端口)来构建GLFW,然后将头文件复制到Linux读取的位置(/usr/include)。


0

手动管理库很繁琐,而且难以管理。其他人提出的许多解决方案都很好,但我建议使用跨平台的包管理器来管理所有这些东西,例如vcpkg。只需安装vcpkg,您就可以轻松安装、卸载和维护所需的任何库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接