【问题标题】:How to build & install GLFW 3 and use it in a Linux project如何构建和安装 GLFW 3 并在 Linux 项目中使用它
【发布时间】:2013-07-20 00:47:29
【问题描述】:

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 编写程序非常容易,因为在线文档非常好,快速浏览所有可用的类和模块,您就可以开始了。以here为特色的一个测试项目的例子也很不错。我发现的两个主要问题是,首先如何在我的系统上设置 GLFW3,其次如何构建 GLFW3 项目?对于非专家来说,这两件事可能还不够清楚。

编辑

今天简单看了一下(日期:2014-01-14),看起来 GLFW 网站自从我上次看以来已经发生了很大的变化,现在有一个关于编译 GLFW 和使用 GLFW 构建程序的部分,我认为是新的。

【问题讨论】:

  • 感谢您把它放在这里 - 显然已经做了很多工作。你介意把它分成一个问题和答案吗?您可以在自己的问题中添加自己的答案并将其标记为正确。
  • @Fraser 当然可以,如果您认为这样会更好
  • 我同意这一点。我非常喜欢 GLFW,但真的很沮丧没有找到任何关于如何在 Mac 下编译 v3 等的文档。
  • @user18490 是的,我发现这有点令人惊讶,因为 GLFW 似乎是“更好的过剩”。我敢肯定他们在他们的文档中提到 glut 只对学习有好处,如果你想要一个专业的窗口库,请使用 GLFW。所以令人惊讶的是他们告诉你它有多好,但不告诉你如何安装它! (与 SFML 完全不同)
  • @爱德华·伯德。我终于在这个网页上找到了一些关于安装 GLFW 的有用信息:scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/…

标签: linux build installation cmake glfw


【解决方案1】:

第 1 步:使用 CMAKE 在您的系统上安装 GLFW 3

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

第一步是从www.glfw.org下载最新版本(假设将来的版本以类似的方式工作),可能使用这个link

下一步是解压存档,然后打开一个终端。 cd 进入 glfw-3.X.X 目录并运行 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...是您需要的其他库,例如 pthread 库......显然我已经有了它们。 (请参阅下面为 g++ 链接器阶段提供的 -l 选项。)

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

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

第二步:创建测试程序并编译

下一步是启动 vim(“什么?!vim?!”你说)或您首选的 IDE/文本编辑器...我没有使用 vim,我使用的是 Kate,因为我在 KUbuntu 13.04 上...无论如何,从here(页面底部)下载或复制测试程序并保存,退出。

现在使用 g++ -std=c++11 -c main.cpp 编译 - 不确定 c++11 是否必需 但我使用了 nullptr 所以,我需要它...您可能需要将 gcc 升级到 4.7 版, 或即将发布的 4.8 版...有关 here 的信息。

如果您手动键入程序或试图“太聪明”并且某些东西不起作用,那么请修复您的错误......然后使用这个怪物链接它! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi 所以你看,在“安装构建依赖项”部分,你可能还想检查你有 GL、GLU、X11 Xxf86vm(不管是什么)Xrandr posix-thread 和 Xi(不管是什么) development 库也安装了。也许也更新您的图形驱动程序,我认为 GLFW 3 可能需要 OpenGL 版本 3 或更高版本?也许有人可以证实这一点?如果您获得对dlclose 的未定义引用,您可能还需要添加链接器选项-ldl -lXinerama -lXcursor 以使其正常工作(归功于@user2255242)。

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

第 3 步:您已完成,祝您有美好的一天!

希望这些信息是正确的,并且一切都对您有用,并且您喜欢编写 GLFW 测试程序。也希望本指南已经或将帮助一些在未来像我昨天今天一样挣扎的人!

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

作者注:

这可能不是一个好主意。这种方法(使用 sudo make install)可能对您的系统有害。 (请参阅不要破坏 Debian)

理想情况下,我或其他人应该提出一个解决方案,它不仅仅将 lib 文件等安装到系统默认目录中,因为这些应该由包管理器(例如 apt)管理,这样做可能会导致冲突和中断你的包管理系统。

请参阅新的“2020 年答案”以获取替代解决方案。

【讨论】:

  • 我花了几个小时试图弄清楚这一点。这个答案对我有用:Ubuntu 13.04,x64。 NetBeans C++ IDE(在 Project Properties->Build->Linker->Libraries->Add Option->Other Option 中添加链接器行 - 否则请逐字按照说明进行操作)
  • 显然(使用 GLFW 3.0.3)某些东西使用了pow,因此将-lm 添加到编译选项中修复了它。
  • 爱德华,谢谢。我需要这种健全性检查,以确保所有 -l 要求不仅仅意味着我做错了什么。
  • 哥们,你真是个他妈的天才!!!!你有 3 个小时,我有 3 天的时间来尝试这样做(实际上是从哪里开始研究,阅读有关过剩历史等等)谢谢你非常感谢你;我还想建议我阅读了 glfw 页面,无法按照他们的教程完成工作,当我发现这一点时几乎要放弃了,他们没有像你那样简单直接地解释。你在这里做得很棒!
  • 在干净的 Linux Mint 上,我必须安装这些软件包:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
【解决方案2】:

I solved it in this way

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  

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

【讨论】:

  • 这个答案是必看的。我之前不知道 pkg-config 。但是从今天开始我会一直使用到最后,因为它可以帮助我解决任何类型的链接依赖问题。谢谢你这么棒的答案。
【解决方案3】:

请注意,如果您使用BUILD_SHARED_LIBS 选项安装glfw,则不需要那么多-ls。 (您可以通过先运行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,这样您就不必一直输入它。

【讨论】:

  • 这个信息对于那些想要设置一个IDE而不是使用终端来编译和运行的人来说非常重要;您能否提供有关如何执行此操作的更多详细信息?我试过了,但完全没有成功
  • 这里是菜鸟!我知道这有点旧,但它确实帮助了我。有人可以解释(或链接到解释的人)为什么使用共享库会成功,这样我们就不必链接所有其他库,其中许多也是共享对象文件?另外,我必须在编译后set the LD_LIBRARY_PATH variable,否则当我尝试运行我新编译的可执行文件时,我会面对 gnu 错误的愤怒。
  • 嗨 Sammaron,感谢您谈论 LD_LIBRARY_PATH,我将更新我的答案以包含此内容。使用 glfw 库时不必指定所有其他库的原因是 glfw 已经加载了它们。您可以使用命令ldd 来检查程序在运行时加载了哪些库。这也是检查是否正确找到库的好方法。您可以在您的程序和 /usr/local/lib/libglfw.so 上使用 ldd 进行比较。
  • 感谢您的回复!另外,我想纠正一下自己:LD_LIBRARY_PATH 变量是一个可行的解决方案,但如果库安装在加载程序将搜索的标准路径中,运行sudo ldconfig 应该可以解决这个问题,并且不需要 LD_LIBRARY_PATH每次都要配置。 This answer 讨论了为什么这可能是首选。
  • 在构建共享后,我不得不编译/链接另外 2 个。 g++ main.cpp -L /usr/local/lib/ -lglfw -lGLU -lGL 为我工作。
【解决方案4】:

2020 年更新答案

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

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

替代建议解决方案

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

  • 转到主目录并从 github 克隆 glfw 存储库
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • 此时您可以创建一个构建目录并按照此处的说明进行操作 (glfw build instructions),但我选择不这样做。以下命令在 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 共享库

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

  • 这应该可以在其他系统上运行,如果不能让我知道,我会提供帮助

【讨论】:

  • 2021 更新:如果遇到No rule to make target '/usr/lib/libNAME.so' 之类的错误,则必须创建指向问题库的符号链接:sudo ln -s /usr/lib/x86_64-linux-gnu/libNAME.so /usr/lib/libNAME.so
【解决方案5】:

由于接受的答案不允许进行更多编辑,我将用一个复制粘贴命令来总结它(将 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

然后单击网站右下角的“生成”按钮并下载 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

【讨论】:

  • 太棒了!使用 GLFW v3.2.1 在 Ubuntu 16.04 上为我工作。只有两个小的更正: set version=X.X.X 应该只是 version="X.X.X" 并且在这一行的末尾应该没有 .zip:cd glfw-${version}.zip
【解决方案6】:

很好的指导,谢谢。鉴于此处的大多数说明,它几乎为我构建,但我确实还有一个错误。

/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 文件。请帮帮我,如何运行它?
  • 我认为您可以将 exec 文件作为 ./main.exec 执行。如果不分享您用于编译代码并生成 .exec 文件的命令。
【解决方案7】:

这解决了我的问题:

sudo apt-get update
sudo apt-get install libglfw3
sudo apt-get install libglfw3-dev

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

【讨论】:

    【解决方案8】:

    如果有人变得懒惰并且可能不知道如何为所有这些库和 -l 配置 shell,那么我创建了一个 python 脚本(你必须有 python3,大多数 linux 用户拥有它。)它允许您轻松编译脚本并运行它们而不必担心,它只是有常规的系统调用,排列整齐,我为自己创建了它,但也许它会有用:Here it is

    【讨论】:

      【解决方案9】:

      详细描述的答案已经存在,但我经历了这个 SHORTER 秘诀:

      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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        相关资源
        最近更新 更多