2013-07-01 18 views
0

我有一個非常惱人的問題。鏈接器不使用庫,但我要求這樣做

Linking CXX executable ../../bin/TheBdfhjkGame 
cd /home/user/projekt/thebdfhjkgame-ipp/build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/TheBdfhjkGame.dir/link.txt --verbose=1 
/usr/bin/c++  CMakeFiles/TheBdfhjkGame.dir/eventReceiver.cpp.o \ 
    CMakeFiles/TheBdfhjkGame.dir/main.cpp.o CMakeFiles/TheBdfhjkGame.dir/game.cpp.o \ 
    CMakeFiles/TheBdfhjkGame.dir/window.cpp.o CMakeFiles/TheBdfhjkGame.dir/player.cpp.o \ 
    CMakeFiles/TheBdfhjkGame.dir/object.cpp.o CMakeFiles/TheBdfhjkGame.dir/benny.cpp.o \ 
    CMakeFiles/TheBdfhjkGame.dir/bullet.cpp.o CMakeFiles/TheBdfhjkGame.dir/base.cpp.o \ 
    CMakeFiles/TheBdfhjkGame.dir/powerRelay.cpp.o CMakeFiles/TheBdfhjkGame.dir/ai.cpp.o \ 
    CMakeFiles/TheBdfhjkGame.dir/qrc_systray.cxx.o \ 
    CMakeFiles/TheBdfhjkGame.dir/__/include/moc_window.cxx.o -o ../../bin/TheBdfhjkGame \ 
    -L/home/user/projekt/thebdfhjkgame-ipp/build/../lib -rdynamic \ 
    /usr/lib/i386-linux-gnu/libXext.so.6 -Wl,-Bstatic -lSM -lICE -lX11 -lXext -lXxf86vm \ 
    -lGLU -Wl,-Bdynamic -lGL -Wl,-Bstatic -lSM -lICE -lX11 -lXext -lz -lglut -lXmu -lXi \ 
    -Wl,-Bdynamic -lQtGui -lQtCore -lBulletDynamics -lBulletCollision -lLinearMath \ 
    -lIrrlicht -Wl,-Bstatic -lXxf86vm -lGLU -Wl,-Bdynamic -lGL -Wl,-Bstatic -lz -lglut \ 
    -lXmu -lXi -Wl,-Bdynamic -lQtGui -lQtCore -lBulletDynamics -lBulletCollision \ 
    -lLinearMath -lIrrlicht -Wl,-rpath,/home/user/projekt/thebdfhjkgame-ipp/build/../lib 
/usr/bin/ld: /usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/libGL.so: undefined reference to symbol 'XextAddDisplay' 
/usr/bin/ld: note: 'XextAddDisplay' is defined in DSO /usr/lib/i386-linux-gnu/libXext.so.6 so try adding it to the linker command line 
/usr/lib/i386-linux-gnu/libXext.so.6: could not read symbols: Incorrect operation 
collect2: error: ld returned 1 exit status 

這是值得注意的是,我用

-rdynamic /usr/lib/i386-linux-gnu/libXext.so.6 

標誌,但鏈接問我

'XextAddDisplay' 在DSO /usr/lib目錄/ i386-定義linux-gnu/libXext.so.6因此請嘗試將其添加到鏈接程序中 命令行

我該如何解決它? makefile是從cmake生成的。

+1

嗯,你爲什麼首先設置-rdynamic?這是一個標誌,並沒有任何參數。您似乎期望它採用文件名的參數。我懷疑一個簡單的-lXext是你需要的。 – oh7lzb

+0

鏈接器命令包含-lXext –

+0

這些庫是一團糟;他們中的大多數被列出幾次,並且有多個'-Wl,-Bstatic'和'-Wl,-Bdynamic'操作。這並不能解釋錯誤。它表現得好像'/ usr/lib/i386-linux-gnu/libXext.so.6'在某種程度上不能用作共享對象。通常,在鏈接行中,您可以指定名稱,而不使用'.6',通常使用'-lExt'(因爲您的代碼的確如此)。然而,我注意到基本的X11庫已經來到諸如'-lQtCore'之類的庫之上了......你可能需要在框架庫之後列出基本的X11庫。 –

回答

0

通常,如果libA依賴於libB,那麼只要libA鏈接就足夠了。但根據新的DSO鏈接變化(http://fedoraproject.org/wiki/UnderstandingDSOLinkChange)現在需要包含libA以及libB。他們這樣做是爲了當libA發佈一個沒有依賴關係的新版本時,編譯不會中斷。他們希望現在自己:)打破它

0

感謝@喬納森的評論,這個命令可以完美運行:

-lQtGui -lQtCore -lQtOpenGL -lQtXml -lXmu -lXt -lXi -lXext -lX11 \ 
-lGL -lGLU -lm -lglut 

還要注意的-lGL-lGLU的順序(以克新版本++/GCC)

相關問題