如何解决运行时符号查找错误?

Posted

技术标签:

【中文标题】如何解决运行时符号查找错误?【英文标题】:How to solve a runtime symbol lookup error? 【发布时间】:2015-07-09 09:38:17 【问题描述】:

我一直在做一个宠物项目,最近遇到了运行时符号查找错误。由于错误本身并没有提供太多信息,我不知道如何解决它。

我正在使用 Eclipse Mars。

我包含以下标题:

#include <GL/glew.h> //glew-1.12.0
#include <GLFW/glfw3.h> //glfw-3.1.1
#include <iostream>
#include <fstream>
#include <algorithm>
#include <math.h>

当我构建项目时,我的控制台输出看起来很正常。

12:05:00 **** Incremental Build of configuration Debug for project Game ****
make all 
Building file: ../main.cpp
Invoking: Cross G++ Compiler
g++ -I/usr/include/libdrm -I/usr/local/include -O0 -g3 -Wall -c -    fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o"         "../main.cpp"
Finished building: ../main.cpp

Building target: Game
Invoking: Cross G++ Linker
g++ -L/usr/local/lib -o "Game"  ./main.o   -lGL -lGLEW -lGLU -lglfw3 -lX11 -lXcursor -lXi -lXinerama -lXrandr -lXxf86vm -lpthread
Finished building target: Game


12:05:01 Build Finished (took 567ms)

但是当我尝试运行它时,我收到以下错误:

/home/lokko/git/buum/Game/Debug/Game: symbol lookup error:/home/lokko/git/buum/Game/Debug/Game: undefined symbol: __glewClipControl

我是一个业余程序员,我知道我已经学会了自己,所以如果 anwser 尽可能清楚地知道我需要做什么才能让它工作,那就太好了。导致问题的具体函数是

glClipControl(GLenum origin,GLenum depth);

编辑: 我在 Nvidia 840m 上运行 opengl 4.5 并使用专有的 Nvidia 驱动程序。 【349】

解决方案: 因此,在我上次更新 Ubuntu 之后,一切都开始工作了。 Dont know what it was. The last update before that was less than 24 hours ago. I wouldnt 认为这是一个实际的解决方案,我会在此问题再次出现时发布。

【问题讨论】:

【参考方案1】:

您遇到的问题是,OpenGL 具有符号类:OS ABI 定义的符号,这些符号和功能被断言可用于在系统(Windows 为 OpenGL-1.1,Linux LSB4 为 OpenGL-1.2,最近发布的 LSB5 为 OpenGL-2.1)。

任何在被断言为可用的 ABI 之外的东西可能不可用,必须首先测试是否存在,然后在运行时通过 OpenGL 扩展机制加载。这涵盖了高于 ABI 中指定的核心 OpenGL 版本,但也包括供应商特定的扩展。在您的情况下,glClipControl 是 OpenGL-4.5 引入的一个函数(在撰写本文时这是最高的 OpenGL 版本)。

因此,要使用此功能,您需要一个相当新的 GPU(嗯,AMD 和 NVidia 在 2012 年之后构建的所有东西都可以解决问题)并且您需要该 GPU 的最新驱动程序。

该错误告诉您,您的 GPU 或您拥有的 OpenGL 实现都不支持您要使用的功能。

现在,在普通 Linux 的情况下,您可能会使用 Mesa 驱动程序(目前仅支持 OpenGL-3.x;最终将支持 OpenGL-4.x)或一个相当过时的供应商专有驱动程序,不支持 OpenGL-4.5。

解决方案:

检查您的 GPU 是否由 Intel 制造(Intel GPU 只有 Mesa 驱动程序) 检查您的 GPU 是否确实支持 OpenGL-4.5 为该 GPU 下载最新的专有驱动程序并安装它们

【讨论】:

这不是我的问题。我应该补充一点,我有一个 Nvidia 840m,并且目前正在运行 OpenGL-4.5。 Noveau 驱动程序已被列入黑名单,并且开发人员环境正在 Nvidia 显卡上运行。我没有编译时错误。问题是我什至找不到任何可以帮助我解决这个问题的文献。 @Andreas:嗯,这不是“标准编程”问题。正如我已经解释过的,OpenGL 有两种符号。核心 ABI 符号和扩展符号。您请求的符号是系统上的扩展符号之一。 __glewClipControl 是 GLEW 加载 glClipControl 和别名的符号(添加此 __glew… 前缀是为了避免命名空间污染)。您可以阅读的关于该主题的唯一文献是关于 OpenGL 扩展加载机制:opengl.org/wiki/Load_OpenGL_Functions @Andreas:如果所有驱动程序都已正确安装,请确保 glewInit() 已成功执行。请注意,在正确设置 OpenGL libGL.so 路径时,大多数 Linux 发行版都相当脑残(Gentoo 是我所知道的唯一发行版,它基本上是正确的)。使用 glxinfo 检查 GLX client vendor 是否也是 NVidia。

以上是关于如何解决运行时符号查找错误?的主要内容,如果未能解决你的问题,请参考以下文章

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?