我正在尝试构建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
下提前致谢。
答案 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个库。
这些都是数学库。 从Ubuntu软件中心安装Synaptic Package Manager。 (假设您正在使用ubuntu - 如果您不是,您可以使用apt-get或其他方式安装软件包)
从Synaptic Package Manager中,搜索以下包:
并安装。
安装TooN:git clone git clone git://github.com/edrosten/TooN.git 这将创建一个TooN目录,无论您将其克隆到何处。导航到TooN目录并键入:
./配置
请
make install
希望这会有所帮助。