2015-04-22 134 views
0

我刚刚开始使用libspatialindex。我运行了指示安装在http://libspatialindex.github.io/install.html,它使用以下命令在Ubuntu上安装好(除了我找不到它提到的autogen.sh)。在C++中未定义对libspatialindex函数的引用

./configure 
make 
sudo make install 

然后我做了一个非常简单的程序来测试它,如下所示(基于https://github.com/libspatialindex/libspatialindex/wiki/Simple-Tutorial

#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 
+0

您是否包含spatialindex命名空间? – itachi

+1

错误表示链接程序找不到相应的代码。请尝试更改顺序: g ++ spatial.cpp -lspatialindex -o spatial 我对单行编译和链接不是很有信心。我总是使用两遍:首先编译,然后链接对象与所需的库。 –

+0

感谢您的建议@itachi,我尝试添加命名空间SpatialIndex(我编辑了上面的问题也显示了这一点),但仍然没有运气。我如何知道SIDX_Version中的名称空间?从文档http://libspatialindex.github.io/doxygen/sidx__api_8h.html – Patrick64

回答

1

问题是关于链接阶段。该库是正确的,因为编译器不会引发这种情况的警报(我现在只是做了一个测试)。 用于检查您所使用的库符号存在做

> nm libspatialindex |grep SIDX_Version 

。可能是libspatialindex_c呢?

+1

谢谢,我试过'gcc -g spatial.c -o spatial -lspatialindex',但是它给了我错误信息'在/usr/local/include/spatialindex/SpatialIndex.h:30:0, /usr来自/usr/local/include/spatialindex/capi/sidx_api.h:34, 的/local/include/spatialindex/capi/sidx_config.h:56, 。c:1: /usr/local/include/spatialindex/tools/Tools.h:59:20:致命错误:iostream:没有这样的文件或目录# – Patrick64

+0

我真的很困惑...你提到的例子是典型的c这就是“capi”所暗示的,但这些包括“使用类”。很抱歉,我稍后会删除我的回复。为了检查缺失的符号是否在这里,让我知道它是否在里面,请在图书馆做一个nm。 –

+0

@ Patrick64你有一些像libspatialindex_c?我看到一个似乎链接到libspatialindex_c而不是libspatialindex的例子。 –

0

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

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

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

同样的问题我很担心,虽然该文件夹确实包含'libspatialindex.a'和类似的文件,所以也许有助于更接近解决方案。 – Patrick64