【问题标题】:libcvd - undefined reference to "x..." while compiling c++libcvd - 编译 C++ 时对“x ...”的未定义引用
【发布时间】: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

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

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

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

提前致谢。

【问题讨论】:

    标签: c++ linux reference makefile


    【解决方案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 目录并输入:

      ./配置

      制作

      进行安装

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-16
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 2016-01-14
        • 2016-04-25
        • 1970-01-01
        相关资源
        最近更新 更多