2013-07-21 135 views
70

GLFW3

昨晚我工作到很晚试图从源头建立GLFW 3包Linux的使用它。这个过程花了我很长时间,总共花了3个小时,部分原因是我不熟悉CMake,部分原因是我对GLFW不熟悉。如何建立和安装GLFW 3,并在Linux项目

我希望这篇文章能够让你免于我昨天遇到的困难!我想我应该做一个简短的报告,并希望为你节省几个小时的生活...

感谢“urraka”,“b6”和“niklas”#glfw IRC频道,我一直能够获得glfw 3.0.1版的工作。

事实证明,这不是一个微不足道的过程(当然不是我的,我不是专家),因为网上关于glfw3的文档并不多,特别是关于使用CMake进行设置。

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

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

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

编辑

有一个简单的介绍一下今天(日期:2014年1月14日),它看起来好像GLFW网站发生了变化沉重,因为我上次看,现在有上编译GLFW和栋程序的部分与GLFW,我认为这是新的。

+0

感谢你把这个放在这里 - 显然有很多工作已经进入它。你介意把它分解成一个问题和答案吗?您可以将自己的答案添加到自己的问题中,并将其标记为正确。 – Fraser

+0

@Fraser当然,如果你认为这会更好, – user3728501

+1

其次。我非常喜欢GLFW,但真的很沮丧,没有找到任何关于如何在Mac下编译v3的文档等。 – user18490

回答

97

第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 glfwsudo 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上......无论如何,从here(位于页面底部)下载或复制测试程序并保存,退出。

现在编译使用g++ -std=c++11 -c main.cpp - 不知道C++ 11是需要但我用这样nullptr,我需要它。你可能需要将GCC升级到4.7版本,或即将推出的版本4.8 .. 。关于该信息here

然后修复你的错误,如果你手工输入程序或试图“太聪明”,并没有工作......然后用它连接它!所以你看,在“安装构建依赖”部分,你可能还想检查你有GL,GLU,X11 Xxf86vm(不管是什么)Xrandr posix-thread和Xi(不管是什么)开发库安装也。也许更新你的图形驱动程序,我认为GLFW 3可能需要OpenGL版本3或更高?也许有人可以证实这一点?您可能还需要添加连接选项-ldl -lXinerama -lXcursor让你越来越未定义的引用dlclose(信用@ user2255242)使其正常工作。

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

第3步:完成后,有一个愉快的一天!

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

顺便说一句,所有的标签都是我搜索计算器上寻找根本不存在的答案的事情。 (到现在为止)如果你和我自己处于类似的位置,希望他们是你所寻找的。

+0

我花了数小时试图弄清楚这一点。这个答案适用于我:Ubuntu 13.04,x64。 NetBeans C++ IDE(在项目属性 - >生成 - >链接器 - >库 - >添加选项 - >其他选项中添加链接器行 - 否则按照说明逐字) –

+0

显然(使用GLFW 3.0.3)在编译选项中添加'-lm'来修复它。 –

+1

爱德华,谢谢。我需要这种理智 - 检查所有-l的要求并不仅仅意味着我做错了什么。 – rangu

16

请注意,如果使用BUILD_SHARED_LIBS选项安装glfw,则不需要那么多-l。 (您可以通过先运行ccmake启用此选项)。
这样sudo make install将在/usr/local/lib/ligglfw.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而不是使用终端进行编译和运行的人非常重要;你能否提供更多关于如何做到这一点的细节?我尝试过,但没有成功 –

+0

Noob here!我知道这有点旧,但它确实帮助了我。有人可以解释(或链接到某人解释)为什么使用共享库会使它成为我们不必链接所有其他库,其中许多库也是共享对象文件?另外,编译后我必须[设置LD_LIBRARY_PATH变量](https://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html),或者在尝试使用gnu时遇到gnu错误的愤怒运行我新编译的可执行文件 – Sammaron

+1

嗨Sammaron,感谢您谈论LD_LIBRARY_PATH,我会更新我的答案以包含此内容。您在使用glfw库时不必指定所有其他库的原因是glfw已经加载它们。您可以使用命令'ldd'来检查程序在运行时加载了哪些库。这也是检查库是否正确找到的好方法。您可以在程序上使用'ldd'并在/usr/local/lib/libglfw.so上进行比较。 – CastleDefender

13

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 

我不知道如果这些库实际上是必要的编制,但对我来说它的工作原理...

+2

这个答案是必须看到的。我以前不知道pkg-config。但从今天起我将使用它直到最后,因为它可以帮助我解决任何类型的链接依赖问题。感谢这样一个真棒的答案。 –

2

大指导,谢谢。鉴于大多数指令在这里,它几乎为我而建,但我确实有一个剩余的错误。

/usr/bin/ld: //usr/local/lib/libglfw3.a(glx_context.c.o): undefined reference to symbol '[email protected]@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行开关。

+0

我得到.o和.exec文件..请帮助我,如何运行它? –

2

由于接受的答案并不能让更多的编辑,我会用一个单一的复制粘贴命令(在第一个命令提供的最新版本替换XXX)来概括它:

version=X.X.X && \ 
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 
+0

太棒了!在Ubuntu 16.04上使用GLFW v3.2.1为我工作。只有两个小的更正:set version = X.X.X应该简单地变为version =“X.X.X”,并且在该行末尾不应该有.zip:cd glfw - $ {version} .zip – Tim