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


95

GLFW3

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

我希望这篇文章能使您摆脱昨天遇到的麻烦!我以为我应该写些简短的文章,并希望为您节省几个小时的生活...

多亏了#glfw IRC频道上的“ urraka”,“ b6”和“ niklas”,我才能够使用glfw 3.0.1版。

事实证明,这并不是一个微不足道的过程(肯定不是我一个人,我也不是专家),因为网上关于glfw3的文档很少,尤其是有关使用CMake进行设置的文档。

我被要求将其分为一个问答部分,所以我做到了,答案部分现在在下面。

您是GLFW的维护者,还是GLFW团队的成员?

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

编辑

今天(日期:2014年1月14日)进行了简要介绍,看来自我上次浏览以来,GLFW网站发生了重大变化,现在有一节介绍如何使用GLFW编译GLFW和构建程序,我认为这是新的。


感谢您在此处提出-显然已经进行了很多工作。您介意将其拆分为问答吗?您可以将自己的答案添加到自己的问题中,并将其标记为正确。
Fraser

@Fraser当然可以,如果您认为那样会更好
user3728501 2013年

1
我同意那个。我喜欢GLFW非常多,但真的很沮丧找不到关于如何编译V3的Mac下等的任何文件
user18490

1
@ user18490是的,我发现这令人惊讶,因为GLFW似乎是“更好的过剩”。我确信他们在文档中提到过剩仅对学习有益,如果您想要专业的Windows库,请使用GLFW。因此,令人惊讶的是他们告诉您它有多好,但没有告诉您如何安装!(与SFML
完全

@爱德华·伯德。我终于找到了关于安装GLFW该网页上的一些有用的信息:scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/...
user18490

Answers:


125

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

对于此安装,我使用的是64位KUbuntu 13.04。

第一步可能是使用此链接www.glfw.org下载最新版本(假设以后的版本以类似的方式)。

下一步是提取档案,然后打开一个终端。cd进入glfw-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......有可能是你需要其他库,如并行线程库......显然,我有他们了。(请参阅下面提供给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-thread和Xi(无论是什么)开发库。也许也要更新您的图形驱动程序,我认为GLFW 3可能需要OpenGL版本3或更高版本?也许有人可以确认?-ldl -lXinerama -lXcursor如果您获得未定义的引用dlclose(贷记为@ user2255242),则可能还需要添加链接器选项才能使其正常工作。

而且,是的,我确实确实需要那么多-l

步骤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要求不仅仅意味着我做错了。
wrongu

3
老兄你是个富人天才!!!!您有3个小时的时间,而我有3天的时间尝试做到这一点(实际上是从哪里开始研究,无论如何都了解过剩的历史等等),非常感谢。我还想建议我阅读了glfw页面,无法按照他们的教程进行工作,当我发现这一点时,他们几乎放弃了,他们没有像您一样解释得如此简单直接。你在这里做了很棒的工作!
维克多·奥利维拉

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

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

18

请注意,-l如果使用BUILD_SHARED_LIBS选件安装glfw,则不需要太多。(您可以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 R. Oliveira 2014年

菜鸟在这里!我知道这有点老,但这确实对我有所帮助。有人可以解释(或链接到某人解释)为什么使用共享库会成功吗,所以我们不必链接所有其他库,其中许多库也是共享对象文件?另外,我必须在编译后设置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年

完成共享构建后,我不得不编译/链接另外2个。g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL为我工作。
Sridhar Thiagarajan'19年

9

由于接受的答案不允许进行更多编辑,因此我将用一个复制粘贴命令对其进行总结(用第一行中的最新版本替换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

如果您正在学习learningopengl.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

然后单击网站右下角的“生成”按钮并下载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
辉煌!在具有GLFW v3.2.1的Ubuntu 16.04上为我工作。只有两个小小的更正:set version = XXX应该只是version =“ XXX”,并且在此行的末尾不应包含.zip:cd glfw-$ {version} .zip
蒂姆

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配置shell ,那么我创建了一个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

说明:我们设法通过CMAKE构建GLFW,这是由Linuxbrew(心爱的Homebrew的Linux端口)完成的。然后将头文件复制到Linux从(/usr/include)读取的位置。


0

2020更新的答案

现在是2020年(7年后),我在这段时间里了解了更多有关Linux的知识。特别是,sudo make install在安装库时运行它可能不是一个好主意,因为它们可能会干扰软件包管理系统。(在这种情况下,apt因为我使用的是Debian10。)

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

替代方案

该信息取自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共享库

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

  • 如果没有让我知道,这应该可以在其他系统上使用,如果可以的话我会帮忙

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.