【问题标题】:Linker don't use library, but I asked to do this链接器不使用库,但我要求这样做
【发布时间】:2013-07-01 13:32:04
【问题描述】:

我有一个非常烦人的问题。

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 生成。

【问题讨论】:

  • 嗯,你为什么要设置 -rdynamic 放在首位?它是一个标志,不带任何参数。您似乎希望它采用文件名参数。我怀疑你需要一个简单的 -lXext 。
  • 链接器命令包含-lXext
  • 图书馆一团糟;它们中的大多数都被列出了几次,并且有多个-Wl,-Bstatic-Wl,-Bdynamic 操作。这并不能解释错误。它的行为好像/usr/lib/i386-linux-gnu/libXext.so.6 在某种程度上不能用作共享对象。通常,在链接行上,您将指定不带.6 的名称,通常为-lExt(实际上,您的代码也是如此)。但是,我注意到基本 X11 库出现在诸如 -lQtCore 之类的库之前...您可能需要在框架库之后列出基本 X11 库。
  • @JonathanLeffler 为什么之后?当A依赖B时,我应该在链接行中将A放在B之前?
  • 没错! -lQtCore (A) 之类的库很可能依赖于 -lXext (B),因此您应该在链接行上将 -lQtCore (A) 放在 -lExt (B) 之前。取决于-lQtCore 中的任何内容,-lExt 的机会基本上为零;相反是可能的(但我从列表中选择了名称-lQtCore 半任意)。我认为您需要在您的“基本”X11 库-lSM -lICE -lX11 -lXext -lXxf86vm -lGLU -lGL -lz -lglut -lXmu -lXi 之前列出的库-lQtGui -lQtCore -lBulletDynamics -lBulletCollision -lLinearMath -lIrrlicht(我从命令行中破解了该列表)。

标签: linux linker makefile cmake


【解决方案1】:

通常,如果一个 libA 依赖于 libB,那么如果 libA 被链接就足够了。但是根据新的 DSO 链接更改 (http://fedoraproject.org/wiki/UnderstandingDSOLinkChange),现在需要包含 libA 和 libB。他们这样做是为了当 libA 发布没有依赖关系的新版本时,编译不会中断。他们现在想自己打破它:)

【讨论】:

    【解决方案2】:

    感谢@Jonathan 的评论,此订单完美运行:

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

    还要注意-lGL-lGLU 的顺序(在较新版本的 g++/GCC 中)

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 2019-11-28
      • 2023-03-28
      • 1970-01-01
      • 2015-06-09
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多