libcvd - 未定义的引用" x ..."在编译c ++时

时间:2013-04-18 08:16:53

标签: c++ linux reference makefile

我正在尝试构建libCVD以便与ROS一起使用(来自www.ros.org)。 我的问题是我收到以下错误:

make[3]: Entering directory `/opt/ros/groovy/stacks/tum_ardrone/thirdparty/libcvd/build'
/usr/bin/g++-4.6 -o progs/cvd_display_image progs/cvd_display_image.o -L. -lcvd  -ltiff -ljpeg -lpng -lpng -llapack -lGLU -lGL -lrt  -L -lX11 -lXext -pthread

./libcvd.so: undefined reference to `XMoveWindow'
./libcvd.so: undefined reference to `XCreateGlyphCursor'
./libcvd.so: undefined reference to `XStoreName'
./libcvd.so: undefined reference to `XLookupString'
./libcvd.so: undefined reference to `XFreeFont'
./libcvd.so: undefined reference to `XSetClassHint'
./libcvd.so: undefined reference to `XCreateWindow'
./libcvd.so: undefined reference to `XCreateColormap'
./libcvd.so: undefined reference to `XOpenDisplay'
./libcvd.so: undefined reference to `XDestroyWindow'
./libcvd.so: undefined reference to `XCloseDisplay'
./libcvd.so: undefined reference to `XUnmapWindow'
./libcvd.so: undefined reference to `XNextEvent'
./libcvd.so: undefined reference to `XSetWMProtocols'
./libcvd.so: undefined reference to `XResizeWindow'
./libcvd.so: undefined reference to `XMapWindow'
./libcvd.so: undefined reference to `XSelectInput'
./libcvd.so: undefined reference to `XFlush'
./libcvd.so: undefined reference to `XWarpPointer'
./libcvd.so: undefined reference to `XLoadQueryFont'
./libcvd.so: undefined reference to `XDefineCursor'
./libcvd.so: undefined reference to `XInternAtom'
./libcvd.so: undefined reference to `XQueryPointer'
./libcvd.so: undefined reference to `XUndefineCursor'
./libcvd.so: undefined reference to `XGetWindowAttributes'
./libcvd.so: undefined reference to `XPending'
collect2: ld returned 1 exit status
make[3]: *** [progs/cvd_display_image] Error 1
make[3]: Leaving directory `/opt/ros/groovy/stacks/tum_ardrone/thirdparty/libcvd/build'
make[2]: *** [libcvd_built] Error 2

还有一个其他stackoverflow问题,几乎有类似的错误(undefined reference error while compiling libcvd)。

我试过建议找出为什么第二个-L选项没有给出路径的原因。所以我最终在项目configure.in文件中,我相信错误发生。 但我对这个构建系统没有经验,所以帮助会很棒。

configure.in文件位于https://dl.dropboxusercontent.com/u/16804463/configure.in

提前致谢。

2 个答案:

答案 0 :(得分:2)

在另一个SO问题中选择的解决方案是不对的。正确的解决方案是未选择的解决方案:错误是您的链接线中缺少路径。您的链接行包含:-L -lX11-L后面应该有一个路径名。由于没有,链接器假定路径名是下一个参数-lX11。这意味着链接器不链接实际的libX11.so库,因为它将库引用视为路径。

你需要查看你的Makefile并找到链接cvd_display_image.o目标的规则,看看这里发生了什么。正如在另一个SO答案中所提到的,很可能你会发现链接行类似于-L$(SOME_VARIABLE)并且该变量是空的。您需要将该变量设置为某个值,可能需要运行make SOME_VARIABLE=.make SOME_VARIABLE=/usr/lib或其他任何值。

看到configure.in文件并不是那么有用:重要的部分是makefile。

在任何情况下,你都应该向这个软件的维护者报告这个问题,以便他们可以解决这个问题:显然他们在这里遇到了一个真正的错误,因为有很多人遇到它。

答案 1 :(得分:2)

我有类似的错误。 我意识到libcvd似乎依赖于以下3个库。

  • LAPACK
  • BLAS
  • 香椿

这些都是数学库。 从Ubuntu软件中心安装Synaptic Package Manager。 (假设您正在使用ubuntu - 如果您不是,您可以使用apt-get或其他方式安装软件包)

从Synaptic Package Manager中,搜索以下包:

  • liblapack-dev
  • libblas-dev的

并安装。

安装TooN:git clone git clone git://github.com/edrosten/TooN.git 这将创建一个TooN目录,无论您将其克隆到何处。导航到TooN目录并键入:

./配置

make install

希望这会有所帮助。