c ++ undefined引用类构造函数

时间:2011-09-26 08:32:01

标签: c++ linker reference undefined

我正在尝试使用一个库,其中一个类有一个像这样的构造函数:

public:
AreaNodeIndex(size_t cacheSize);

我正试图在我的程序中实例化这个类的对象,如下所示:

size_t const cacheSize = 50000;
AreaNodeIndex areaNodeIndex(cacheSize);

链接器给出了以下错误:

main.o: In function `main':
make: Leaving directory `/home/Dev/_quicktest_build'
main.cpp:(.text+0x212): undefined reference to  
osmscout::AreaNodeIndex::AreaNodeIndex(unsigned int)

我认为我有必要的包含,并且我使用编译器链接到库。例如,如果我尝试在没有任何参数的情况下实例化对象,我会收到此错误:

../quicktest/main.cpp: In function ‘int main()’:
../quicktest/main.cpp:36: error: no matching function for call to ‘osmscout::AreaNodeIndex::AreaNodeIndex()’
/usr/local/include/osmscout/AreaNodeIndex.h:75: note: candidates are: osmscout::AreaNodeIndex::AreaNodeIndex(size_t)
/usr/local/include/osmscout/AreaNodeIndex.h:33: note:     osmscout::AreaNodeIndex::AreaNodeIndex(const osmscout::AreaNodeIndex&)

所以我可以看到正确的原型(虽然这里说的是size_t,之前它说的是unsigned int)......

我可以使用该库的其他部分。以下是相关课程的实际源文件:

http://libosmscout.git.sourceforge.net/git/gitweb.cgi?p=libosmscout/libosmscout;a=blob;f=libosmscout/include/osmscout/AreaNodeIndex.h

http://libosmscout.git.sourceforge.net/git/gitweb.cgi?p=libosmscout/libosmscout;a=blob;f=libosmscout/src/osmscout/AreaNodeIndex.cpp

我很遗憾为什么会这样。我觉得我错过了一些明显的东西。

*回复回复: 该库从“sys / types.h”获取size_t,所以我认为我们不会使用不同的版本。该库是在我的系统上使用相同的编译器(g ++,linux)编译的。 更改'const'说明符位置无效。

我正在链接到图书馆。正如我所提到的,我可以毫无问题地使用库中的其他类。这是链接命令:

g ++ -Wl,-O1 -Wl,-rpath,/ home / QtSDK / Desktop / Qt / 473 / gcc / lib -o quicktest main.o -L / home / QtSDK / Desktop / Qt / 473 / gcc / lib -losmscout -lpthread

库名是'osmscout'。

KFL

5 个答案:

答案 0 :(得分:2)

在您的情况下可能导致问题的原因可能是由于@rodrigo提到的不同size_t混合。为了保持一致性,您可以在<cstddef>处使用size_t,除非您的项目为typedef声明了size_t。请参考以下链接。

请参阅Does "std::size_t" make sense in C++?

希望这有帮助!

答案 1 :(得分:1)

问题可能是实际的size_t typedef取决于几个编译器选项。即使在完整的32位计算机中,也可以是unsigned intunsigned long,具体取决于开发人员的心情。

因此,如果使用typedef unsigned long size_t;编译库并且您的程序使用typedef unsigned int size_t;,那么您就会遇到问题。您可以使用objdump -t library | c++filt | grep AreaNodeIndex或类似的内容进行检查。

答案 2 :(得分:0)

您没有向我们展示最重要的部分:以前使用的命令行 编辑。您可能没有指定要链接的库 (选项-l-L,或者您可以像任何一样指定库 其他文件)。

对于指定unsigned int和编译器size_t的链接器, 这只是错误显示方式的一个神器: 编译器将显示typedef的名称,如果这是使用的 在声明功能时。链接器没有此信息, 所以显示实际类型的名称。

答案 3 :(得分:-1)

看起来你没有正确链接库。

答案 4 :(得分:-1)

你可以尝试

吗?

const size_t cacheSize = 50000;

代替?

[编辑] 好吧,我想如果那个声明给你一个无符号的长度,而不是有一些被忽略的编译器选项,并且size_t在你的编译器中被定义为unsigned long的typedef,而不是一个匹配的类型与图书馆看到的一样。