有没有一种方法可以自动链接 OpenGL 程序需要的所有库,而无需在编译时显式编写它们的标志?

Posted

技术标签:

【中文标题】有没有一种方法可以自动链接 OpenGL 程序需要的所有库,而无需在编译时显式编写它们的标志?【英文标题】:Is there a way to automatically link all libraries an OpenGL program needs, without explicitly writing their flags on compile? 【发布时间】:2016-08-13 05:35:01 【问题描述】:

对于入门级程序,我目前正在编译

g++ manip.c -o manip -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -ldl -lXinerama -lXcursor -lGLEW

这是一个非常耗时的过程,需要反复试验找出哪些标志是必要的,谷歌搜索“未定义的引用”,复制粘贴我遇到的每个标志,然后一个接一个地删除标志,直到我删除那些我不需要。

对于正在学习绳索的初学者,在教程中编译示例程序(没有关于如何编译的说明),有没有办法自动链接程序可能需要的所有内容?也许是一种移动库的方法,这样它们就不必显式链接了?

如果没有,有没有办法简化标志添加过程? (我可以想象随着程序复杂性的增加,所有标志的命令都会变得非常长。)

【问题讨论】:

了解如何使用 makefile 或像 cmake 这样的 makefile 生成器 您应该查看实际的构建系统,而不是手动编写命令行。 g++ manip.c -o manip `pkg-config glfw3 glew --cflags --libs`? @genpfault: Upstream manual 确实推荐 pkg-config 如果你不使用像 CMake 这样的元构建系统。 当我使用您粘贴的命令 genpfault 以及您链接的上游手册中的静态和共享命令时,TBBle,数百?未定义的引用错误结果。 【参考方案1】:

我正在为我所处水平的人写这个答案。

您显然可以编写会自动检测应链接哪些库的生成文件。这样做的语法超出了我的理解范围,但如果我继续这样做,我会在以后编辑它。

为了简化编译选项,您可以编写一个生成文件来链接您可能需要的每个库。我在下面包含的示例包含到目前为止我发现需要的库,并且在我进一步开发 OpenGL 程序时可能需要大量扩展。

调用文件“Makefile”。使用命令make 运行它。

所以 vim Makefile

在文件里面,我有这个:

manip: manip.c
        g++ manip.c -o manip -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -ldl -lXinerama -lXcursor -lGLEW -lglfw3 -lGL -lm -lXi

第一行: 之前的术语将是输出可执行文件。第一行 : 之后的术语是可执行文件所依赖的 C/C++ 文件。下一行是如果 Makefile 检测到源代码(在第一行的: 之后)发生更改时将执行的内容。

如果您有一组更广泛的相互依赖的文件,您可以使用相同的语法在下面添加它们(如果与您相关,请在 Google 上搜索)。

所以我现在编辑manip.c 文件,运行命令make,然后为我生成manip

【讨论】:

仅供参考:这真的归结为链接器以及正在使用的其他库如何自行链接。使用现代链接器(例如,在我的系统上当前是 GNU ld 2.25)和与之链接的共享对象,间接依赖关系会自动引入,您可以编写像 g++ -o … -lGL -lGLEW -lglfw 这样简单的东西,其余的都会自动引入。 我最初只尝试了几个标志,包括那些主要的,但有未定义的引用。是否有一个标志可以使用 -lX... 开头的所有库? 这不是标志的问题(没有自动拉取所有依赖项的神奇标志)。这是您使用哪种特定构建的工具链和库的问题。如果您使用的 Linux 发行版“一切”都被剥夺了共享对象和/或安装的工具链缺少所需的功能,那么您无能为力。这就是为什么像pkg-config 这样的东西首先出现的原因。您没有指定您使用哪个特定的 Linux 发行版。例如,与上游版本的工具和库相比,Debian 通常已经过时了。

以上是关于有没有一种方法可以自动链接 OpenGL 程序需要的所有库,而无需在编译时显式编写它们的标志?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 程序着色器链接错误

OpenGL着色器的显式与自动属性位置绑定

1基于MFC的OpenGL程序

OpenGL学习脚印: 绘制一个三角形

opengl 学习的链接,以后需要可以再来查需要的

四第一个opengl的qt程序