我正在尝试使用一个库,其中一个类有一个像这样的构造函数:
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)......
我可以使用该库的其他部分。以下是相关课程的实际源文件:
我很遗憾为什么会这样。我觉得我错过了一些明显的东西。
*回复回复: 该库从“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
答案 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 int
或unsigned 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,而不是一个匹配的类型与图书馆看到的一样。