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