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

use*_*501 83 linux install build cmake glfw

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-01-14),看起来GLFW网站自从我上次查看以来已经发生了很大的变化,现在有一个关于用GLFW编译GLFW和建筑程序的部分,我认为这是新的.

use*_*501 115

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

对于这个安装,我使用的是KUbuntu 13.04,64bit.

第一步是从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,我用凯特,因为我上的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线程和熙(无论是)发展还安装库.也许更新你的图形驱动程序,我认为GLFW 3可能需要OpenGL版本3或更高版本?也许有人可以确认一下?您可能还需要添加链接器选项-ldl -lXinerama -lXcursor,以便在获得未定义的引用时使其正常工作dlclose(信用于@ user2255242).

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

第3步:你完成了,祝你有愉快的一天!

希望这些信息是正确的,一切都适合您,您喜欢编写GLFW测试程序.也希望这本指南的帮助下,或会有所帮助,有几个人在未来谁是挣扎,因为我是今天昨天!

顺便说一句,所有标签都是我在stackoverflow上搜索的东西,寻找不存在的答案.(直到现在.)如果你和我一样处于类似的位置,希望它们是你搜索过的.

  • 为此+1.GLFW老兄应该将它添加到手册中. (3认同)
  • 老兄,你是天啊!!!! 你有3个小时,我有3天尝试这样做(实际上从哪里开始研究,阅读过剩史等等)谢谢你非常感谢你们.我还想建议我阅读glfw页面,无法按照他们的教程完成工作,当我发现这个时几乎放弃了,他们不会像你那样简单直接地解释.你在这里做的很棒! (3认同)

小智 17

请注意,-l如果使用该BUILD_SHARED_LIBS选项安装glfw,则不需要那么多s .(您可以ccmake先运行启用此选项).
这种方式sudo make install将安装共享库/usr/local/lib/libglfw.so.然后,您可以使用简单的方法编译示例文件:

g++ main.cpp -L /usr/local/lib/ -lglfw
Run Code Online (Sandbox Code Playgroud)

然后在运行程序之前不要忘记将/ usr/local/lib /添加到共享库的搜索路径中.这可以使用:

export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}
Run Code Online (Sandbox Code Playgroud)

你可以将它放在〜/ .bashrc中,这样你就不必一直输入它.


Ole*_*zan 15

我以这种方式解决了它

pkg-config文件描述了使用库所需的所有必需的编译时和链接时标志和依赖项.

pkg-config --static --libs glfw3
Run Code Online (Sandbox Code Playgroud)

告诉我那个

-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  
Run Code Online (Sandbox Code Playgroud)

我不知道所有这些库是否真的是编译所必需的,但对我来说它有效...

  • 这个答案是必须看到的.我之前不知道pkg-config.但是从今天开始我将使用它直到最后,因为它将帮助我解决任何类型的链接依赖问题.谢谢你这么棒的答案. (2认同)

use*_*501 11

2020 更新答案

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

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

替代方案

此信息取自 GLFW 文档,但我已扩展/简化了与 Linux 用户相关的信息。

  • 转到主目录并从 github 克隆 glfw 存储库
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
Run Code Online (Sandbox Code Playgroud)
  • 此时您可以创建一个构建目录并按照此处的说明(glfw 构建说明)进行操作,但是我选择不这样做。以下命令似乎在 2020 年仍然有效,但 glfw 在线说明没有明确说明。
cmake -G "Unix Makefiles"
Run Code Online (Sandbox Code Playgroud)
  • 您可能需要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)
Run Code Online (Sandbox Code Playgroud)
  • 如果您不喜欢 CMake,那么我很抱歉,但在我看来,这是让您的项目快速运行的最简单方法。我建议学习使用它,至少要达到基本水平。遗憾的是我不知道任何好的 CMake 教程

  • 然后执行cmake .and make,您的项目应该构建并链接到 glfw3 共享库

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

  • 这应该适用于其他系统,如果不能让我知道,如果我能够,我会提供帮助


Adr*_*ian 8

由于接受的答案不允许进行更多编辑,因此我将使用单个复制粘贴命令(使用第一个命令中提供的最新版本替换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
Run Code Online (Sandbox Code Playgroud)

如果要编译程序,请使用以下命令:

g++ -std=c++11 -c main.cpp && \
g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lXinerama -lXcursor
Run Code Online (Sandbox Code Playgroud)

如果您正在关注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

然后单击网站右下角的"生成"按钮并下载zip文件.使用以下命令解压缩并编译源:

g++ glad/src/glad.c -c -Iglad/include
Run Code Online (Sandbox Code Playgroud)

现在,编译程序的命令变成这样:

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
Run Code Online (Sandbox Code Playgroud)

  • 辉煌!在具有GLFW v3.2.1的Ubuntu 16.04上为我工作。只有两个小小的更正:set version = XXX应该只是version =“ XXX”,并且在此行的结尾不应有.zip:cd glfw-$ {version} .zip (2认同)

yeh*_*ahs 7

这对我来说解决了:

sudo apt-get update
sudo apt-get install libglfw3
sudo apt-get install libglfw3-dev
Run Code Online (Sandbox Code Playgroud)

摘自https://github.com/glfw/glfw/issues/808


小智 5

很棒的指南,谢谢。鉴于这里的大多数说明,它几乎为我构建,但我确实有一个剩余的错误。

/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
Run Code Online (Sandbox Code Playgroud)

搜索到这个错误后,我不得不添加-ldl到命令行。

g++ main.cpp -lglfw3 -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lGL -lpthread -ldl
Run Code Online (Sandbox Code Playgroud)

然后编译并链接“hello GLFW”示例应用程序。

我对 Linux 还很陌生,所以我不完全确定这个额外的库到底做了什么......除了修复我的链接错误。不过,我确实在上面的帖子中看到了 cmd 行开关。