【问题标题】:Undefined reference to libspatialindex functions in C++C++ 中对 libspatialindex 函数的未定义引用
【发布时间】:2015-04-22 18:47:38
【问题描述】:

我刚刚开始使用 libspatialindex。我浏览了instructions to install,它使用以下命令在 ubuntu 上安装正常(除了我找不到它提到的 autogen.sh)。

./configure
make
sudo make install

然后我做了一个非常简单的程序来测试它如下(基于this

#include <spatialindex/capi/sidx_api.h>
using namespace SpatialIndex;
int main(int argc, char* argv[])
{
    char* pszVersion = SIDX_Version();
}

编译如下:

g++ -lspatialindex spatial.cpp -o spatial

它给了我错误:

/tmp/ccACK3p4.o: In function `main':
spatial.cpp:(.text+0xa): undefined reference to `SIDX_Version'
collect2: ld returned 1 exit status

我尝试了许多不同的方法,例如改用 cmake 并将其安装到不同的文件夹,但没有运气。有什么想法吗?

编辑:

在上面添加了命名空间 SpatialIndex,我也尝试了以下方法,但仍然没有运气:

g++ -c -o spatial.o spatial.cpp
g++ -o spatial spatial.o -lspatialindex -lm

【问题讨论】:

  • 你是否包含了 spatialindex 命名空间?
  • 错误说链接器没有找到对应的代码。请尝试更改顺序: g++ spatial.cpp -lspatialindex -o spatial 我对单行编译和链接不是很有信心。我总是使用两遍:首先编译,然后将对象与所需的库链接。
  • 感谢@itachi 的建议,我尝试添加命名空间 SpatialIndex(我也编辑了上面的问题以显示这一点)但仍然没有运气。我如何知道 SIDX_Version 在哪个命名空间中?从文档中不清楚libspatialindex.github.io/doxygen/sidx__api_8h.html
  • @MelVisoMartinez,我尝试了相反的方法并将编译和链接分开(如我对问题的编辑所示)但没有运气。

标签: c++ spatial-index


【解决方案1】:

问题在于链接阶段。正确找到了该库,因为编译器不会引发这种情况的警报(我现在刚刚进行了测试)。 做一个

> nm libspatialindex |grep SIDX_Version

用于检查您正在使用的库中的符号是否存在。可能是 libspatialindex_c 吗?

【讨论】:

  • 谢谢,我试过gcc -g spatial.c -o spatial -lspatialindex,但它给了我错误In file included from /usr/local/include/spatialindex/SpatialIndex.h:30:0, from /usr/local/include/spatialindex/capi/sidx_config.h:56, from /usr/local/include/spatialindex/capi/sidx_api.h:34, from spatial.c:1: /usr/local/include/spatialindex/tools/Tools.h:59:20: fatal error: iostream: No such file or directory
  • 我真的很困惑......你提到的例子是典型的c,是“capi”所建议的,但这些包括¡使用类!。对不起,我稍后会删除我的回复。请在库上做一个 nm 以检查丢失的符号是否在这里,并让我知道它是否在里面。
  • @Patrick64 你有类似 libspatialindex_c 的吗?我看到了一个似乎链接到 libspatialindex_c 而不是 libspatialindex 的示例。
  • 是的,/usr/local/lib 文件夹中有一个 libspatialindex_c.a 文件,gcc -g spatial.c -lspatialindex_c -o spatial 和以前一样。
  • 如果由于缺少符号而失败,请使用 -lspatialindex_c 和 -lspatialindex 包含两个库(按此顺序)。我必须离开休息。我希望这会有所帮助。
【解决方案2】:

默认情况下,libspatialindex 安装目标是/usr/local。您没有在调用./configure 时覆盖它,所以make install 将安装它。

编译器知道在/usr/local/include 中查找包含文件,因此编译不是问题。但是它不知道在usr/local/lib 中查找库。一个简单的解决方法是将其添加到您的链接步骤中:

g++ -o spatial spatial.o -lspatialindex -lm -L/usr/local/lib

【讨论】:

  • 我担心同样的问题,虽然该文件夹确实包含 libspatialindex.a 和类似的文件,所以也许它有助于更​​接近解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多