【问题标题】:OpenGL Compilation Errors UbuntuOpenGL 编译错误 Ubuntu
【发布时间】:2013-08-14 14:29:58
【问题描述】:

我正在尝试设置代码 http://www.openglsuperbible.com/example-code/

使用命令:

$ cmake -G "Unix Makefiles" ; make clean ; make all

为了准备系统,我安装了以下软件包:

xrandr libxrandr x11-xserver-utils libxrandr-dev libglfw2 libglfw-dev xorg-dev libx11-dev libgl-dev libglu-dev libgl1-mesa-dev freeglut3 freeglut3-dev mesa-common-dev freeglut3-dev build-essential libx11-dev libx11-*

我可能错过了我在此列表中安装的一些软件包,我深表歉意。

然后我修改了 CMakeList.txt 以便在链接阶段添加以下内容:

glfw GL rt glut X11 dl Xrandr Xext GLEW GLU

然后我尝试编译,但在链接阶段失败:

/opt/sb6code/src/xraw/xraw.c: In function ‘CreateWindow’:
/opt/sb6code/src/xraw/xraw.c:106:14: warning: assignment makes pointer from integer without a cast [enabled by default]
Linking C executable bin/xraw
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function CreateWindow: error: undefined reference to 'XOpenDisplay'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function CreateWindow: error: undefined reference to 'XCloseDisplay'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function CreateWindow: error: undefined reference to 'XCreateColormap'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function CreateWindow: error: undefined reference to 'XCreateWindow'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function CreateWindow: error: undefined reference to 'XMapWindow'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function CreateWindow: error: undefined reference to 'glXCreateContextAttribsARB'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function Cleanup: error: undefined reference to 'XDestroyWindow'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function Cleanup: error: undefined reference to 'XCloseDisplay'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function main: error: undefined reference to 'XNextEvent'
CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function main: error: undefined reference to 'XGetWindowAttributes'
collect2: error: ld returned 1 exit status
make[2]: *** [bin/xraw] Errore 1
make[1]: *** [CMakeFiles/xraw.dir/all] Errore 2
make: *** [all] Errore 2

现在,我尝试在网络上搜索,甚至在 SO.com 上搜索解决方案,但他们一直告诉我链接我已经添加到链接阶段的库..所以我似乎无法取得更多进展。

你有什么知识或提示可以帮助我吗?


好的,受到答案的刺激,我进入了 CMakeFiles 目录并寻找管理编译的配置文件。我发现由于某些原因,尽管我进行了更新,但它确实错过了 CMakeLists 中声明的一些标志。

所以现在编译行看起来像:

/usr/bin/cc      CMakeFiles/xraw.dir/src/xraw/xraw.c.o  -o bin/xraw  -L/opt/sb6code/lib -rdynamic -lGL -lglut -lGLU -lm -lX11 -ldl -lGLEW -lXrandr -lXext -lrt -lglfw -Wl,-rpath,/opt/sb6code/lib 

并且错误减少到:

CMakeFiles/xraw.dir/src/xraw/xraw.c.o:xraw.c:function CreateWindow: error: undefined reference to 'glXCreateContextAttribsARB'
collect2: error: ld returned 1 exit status
make[2]: *** [bin/xraw] Errore 1
make[1]: *** [CMakeFiles/xraw.dir/all] Errore 2
make: *** [all] Errore 2

其他提示? :)

旁注: 我还安装了 CUDA 库和路径下

/usr/lib/nvidia-304/

我碰巧有

alt_ld.so.conf                libnvidia-ml.so.1
bin/                          libnvidia-ml.so.304.88
ld.so.conf                    libnvidia-opencl.so.1
libcuda.so                    libnvidia-opencl.so.304.88
libcuda.so.1                  libnvidia-tls.so.304.88
libcuda.so.304.88             libnvidia-wfb.so.1
libGL.so                      libnvidia-wfb.so.304.88
libGL.so.1                    libOpenCL.so
libGL.so.304.88               libOpenCL.so.1
libnvcuvid.so                 libOpenCL.so.1.0
libnvcuvid.so.1               libOpenCL.so.1.0.0
libnvcuvid.so.304.88          libXvMCNVIDIA_dynamic.so.1
libnvidia-cfg.so              libXvMCNVIDIA.so
libnvidia-cfg.so.1            libXvMCNVIDIA.so.1
libnvidia-cfg.so.304.88       libXvMCNVIDIA.so.304.88
libnvidia-compiler.so         tls/
libnvidia-compiler.so.1       vdpau/
libnvidia-compiler.so.304.88  xorg/
libnvidia-glcore.so.304.88    XvMCConfig
libnvidia-ml.so  

我想使用它,因为我不确定我的英特尔显卡是否支持 OpenGl 4.*,我将在本书中使用它,而 nvidia 支持 4.2。

我实在找不到什么好的方法,这本书方便地避免给出安装说明。


临时解决方案: 我发现这是唯一不起作用的源文件。在有人找到另一个解决方案之前,删除其文件和 CMakeList.txt 配置似乎是明智的。

另外,我必须使用 optirun 来运行可执行文件,以防其他使用 bumblebee/nvidia 的人想知道为什么他们的程序无法运行。

【问题讨论】:

  • 你是说cmake -G ... 吗?
  • 是的,我很抱歉,我没有 c&p :-)

标签: c opengl ubuntu glut


【解决方案1】:

您可能以错误的顺序链接库;所有这些符号libX11.a中定义;您应该想看看提供给 GCC 的实际链接命令行是什么,并在此处发布。

更新现在这意味着您正在尝试静态链接到您的库中不可用的 API 函数(它是一个可选扩展,应该动态查询)。

【讨论】:

  • 我假设 .c 是 C 代码。正确的顺序应该是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2012-08-26
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多