2015-06-29 10 views
2

從這個來源下載的代碼:http://n.ethz.ch/~vartokb/gl-shaders.html麻煩編制分動畫節目的Xlib和過剩

我運行make文件,我得到的XLib和過剩庫未定義的引用。例如,

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 

的Makefile文件:

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 [email protected] 

$(OBJS): $(HDRS) 

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

我已經安裝了的Xlib運行:

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

我安裝了freeglut a前一陣子。當我列出目錄的內容在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 

爲什麼我得到了一個未定義的引用,當我擁有所有編譯所需的文件?

+2

'-L/usr/include/GL /'這看起來像一個* include *路徑。應將'-L'用於* library *路徑。也許有'/ usr/lib/GL /'文件夾? (注意:我知道關於過剩,所以這是在黑暗中刺)。 '-L/usr/include/X11 /'也是一樣的(在我的裝備上,Mac OSX,包含路徑是'/ usr/X11/include',匹配的庫路徑是'/ usr/X11/lib' 。ymmv)。 – WhozCraig

+0

嗨,感謝評論我找出了錯誤,這是一個參數排序的問題。 –

回答

0

我的問題是參數排序,爲用戶cyberguijarro在這裏指出:Linker problems in Ubuntu 11.10

@boto我知道。實際上,問題出在參數順序上。 Ubuntu 11.10發佈了GCC 4.6.1,這顯然會引入更嚴格的參數排序約束。 g ++ test.cpp -lX11正常工作。 - cyberguijarro月24 '12在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 

允許它來編譯。