libcvd - 编译 C++ 时对“x ...”的未定义引用

Posted

技术标签:

【中文标题】libcvd - 编译 C++ 时对“x ...”的未定义引用【英文标题】:libcvd - undefined reference to "x..." while compiling c++ 【发布时间】:2013-04-18 08:16:53 【问题描述】:

我正在尝试构建 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

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

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

configure.in 文件在https://dl.dropboxusercontent.com/u/16804463/configure.in 下可用

提前致谢。

【问题讨论】:

【参考方案1】:

在另一个 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。

在任何情况下,您都应该将此情况报告给该软件的维护人员,以便他们进行修复:显然,他们在这里遇到了一个真正的错误,因为很多人都遇到了这个问题。

【讨论】:

【参考方案2】:

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

拉包 废话 香椿

这些都是数学库。 从 Ubuntu 软件中心安装 Synaptic 软件包管理器。 (假设你使用的是 ubuntu - 如果你不是,你可以使用 apt-get 或其他方式安装包)

在 Synaptic 包管理器中,搜索以下包:

liblapack 开发 libblas 开发

并安装。

安装TooN: git clone git clone git://github.com/edrosten/TooN.git 这将在您将其克隆到的任何位置创建一个 TooN 目录。导航到 TooN 目录并输入:

./配置

制作

进行安装

希望这会有所帮助。

【讨论】:

以上是关于libcvd - 编译 C++ 时对“x ...”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

c++ 在编译时对define所定义的变量是怎么处理的?

尝试使用 C++/CLI 时对 AfxInitExtensionModule 的断言

c++ 中的 final 关键字是不是允许额外的编译器优化?

C++中#if #ifdef 的作用

如何在 OS/X 的编译时确定编译标志?

浅谈C语言的编译器!