编译分形动画程序 Xlib 和 glut 时遇到问题

Trouble compiling fractal animation program Xlib and glut

从此来源下载代码:http://n.ethz.ch/~vartokb/gl-shaders.html

我 运行 make 文件,我得到了对 xlib 和 glut 库的未定义引用。例如,

  undefined reference to `XOpenDisplay'
  undefined reference to `XDefaultScreen'
  undefined reference to `glXChooseVisual'
  .
  .
  .
   undefined reference to `__glewGenBuffers'
   undefined reference to `__glewBindBuffer'
   undefined reference to `__glewBufferData'

编译行如下所示,生成文件如下:

   g++ -L/usr/include/GL/ -L/usr/include/X11/ -lm -lrt -lglut -lGLEW -lGL -lGLU -lX11 main.o events.o graphics.o -o gl-shaders

生成文件:

NAME = gl-shaders
CXX = g++
CXXFLAGS = -O3
LDFLAGS = -L/usr/include/GL/ -L/usr/include/X11/ -lm -lrt -lglut -lGLEW -lGL -lGLU -lX11
SRCS = main.cpp events.cpp graphics.cpp
OBJS = $(SRCS:%.cpp=%.o)
HDRS = config.hpp main.hpp

all: $(NAME)

$(NAME): $(OBJS)
        $(CXX) $(LDFLAGS) $(OBJS) -o $(NAME)

.cpp.o:
        $(CXX) $(CFLAGS) $(LFLAGS) -c $< -o $@

$(OBJS): $(HDRS)

clean:
        rm -f $(OBJS)
        rm -f $(NAME)

我已经通过 运行ning 安装了 Xlib:

sudo aptitude install xorg-dev
sudo apt install xorg-dev
sudo apt-get install libx11-dev

而且我前阵子安装了freeglut。当我列出 makefile 中链接的目录的内容时,我看到:

 :l /usr/include/GL/
freeglut_ext.h  freeglut_std.h  glew.h   gl.h         glu.h         glut.h   glxext.h  glxint.h      glxmd.h     glxtokens.h  wglew.h
freeglut.h      glcorearb.h     glext.h  gl_mangle.h  glu_mangle.h  glxew.h  glx.h     glx_mangle.h  glxproto.h  internal/

对于 Xlib:

l /usr/include/X11/
ap_keysym.h   Constraint.h  DECkeysym.h  HPkeysym.h    IntrinsicP.h  RectObj.h     ShellI.h      TranslateI.h  Xatom.h   Xdmcp.h       XKBlib.h    Xmd.h      Xpoll.h      Xthreads.h  Xwindows.h
bitmaps/      ConvertI.h    dri/         ICE/          keysymdef.h   RectObjP.h    ShellP.h      VarargsI.h    Xauth.h   XF86keysym.h  XlibConf.h  Xmu/       Xproto.h     Xtos.h      Xwinsock.h
CallbackI.h   Core.h        EventI.h     ImUtil.h      keysym.h      ResConfigP.h  SM/           Vendor.h      Xaw/      Xft/          Xlib.h      Xosdefs.h  Xprotostr.h  Xtrans/
Composite.h   CoreP.h       extensions/  InitialI.h    Object.h      ResourceI.h   StringDefs.h  VendorP.h     Xcms.h    Xfuncproto.h  Xlibint.h   Xos.h      Xregion.h    Xutil.h
CompositeP.h  CreateI.h     fonts/       Intrinsic.h   ObjectP.h     SelectionI.h  Sunkeysym.h   Xalloca.h     Xcursor/  Xfuncs.h      Xlib-xcb.h  Xos_r.h    Xresource.h  Xw32defs.h
ConstrainP.h  cursorfont.h  HookObjI.h   IntrinsicI.h  PassivGraI.h  Shell.h       ThreadsI.h    Xarch.h       Xdefs.h   X.h           Xlocale.h   xpm.h      xshmfence.h  XWDFile.h

当我拥有编译所需的所有文件时,为什么我会得到未定义的引用?

我的问题是参数排序,正如用户 cyberguijarro 在这里指出的那样:Linker problems in Ubuntu 11.10

@boto I know that. Actually, the problem was in the parameter order. Ubuntu 11.10 ships GCC 4.6.1, which apparently introduces stricter parameter ordering constraints. g++ test.cpp -lX11 works fine. – cyberguijarro Jan 24 '12 at 9:37

因此,通过更改编译行:

g++ -I/usr/include/GL/ -lglut -lGL -lGLEW -lGLU -I/usr/include/X11/ -lm -lrt -lX11 main.o events.o graphics.o -o gl-shaders

对此:

g++ main.o events.o graphics.o -I/usr/include/GL/ -lglut -lGL -lGLEW -lGLU -I/usr/include/X11/ -lm -lrt -lX11 -o gl-shaders

允许编译。