我正在开发一个(C ++)程序,它必须处理与文件/目录相关的大量信息(因此我或多或少地将路径作为键)。目前我尝试使用哈希表进行实现。考虑到数据量,这似乎工作得相当好,但在分析后我发现它们仍然是系统中最慢的链接,所以为了改进我会考虑使用Trie。
我发现以下(C实现)http://linux.thai.net/~thep/datrie/datrie.html并在那里阅读文档似乎相当不错。但是,在尝试编写一个简单的测试片段时,我最终会遇到一个奇怪的链接错误。
奇怪的是:有问题的函数存在(如在其中,在cpp文件中)并且创建了目标文件,那么为什么会出现链接错误呢?
我的代码:
#include <iostream>
#include <datrie/trie.h>
extern int main(int, char**)
{
// create character map covering unicode characters
AlphaMap *map = alpha_map_new();
AlphaChar start = 32, end = 1114111;
alpha_map_add_range(map, start, end);
// create a trie and test it
Trie *test = trie_new(map);
const AlphaChar key[] = {0x64,0x64,0x64,0x64};
trie_store(test, key, 3);
TrieData *data;
trie_retrieve(test, key, data);
std::cout << *data << std::endl;
return 0;
}
错误(简化并将其换行以便于阅读)
main.obj : error LNK2001: unresolved external symbol
"int __cdecl alpha_map_add_range(struct _AlphaMap *,unsigned int,unsigned int)"
main.obj : error LNK2001: unresolved external symbol
"struct _AlphaMap * __cdecl alpha_map_new(void)"
使用Visual Studio 2010
答案 0 :(得分:2)
你正在混合使用C和C ++。当您在C ++代码中包含datatrie / trie.h时,编译器会假定它是一个C ++头,但无论libdatatrie是C库还是其头文件都不是C ++友好的。
包括如下标题:
extern "C" {
#include <datrie/trie.h>
}
答案 1 :(得分:0)
有一些可能性,但您的示例并未向我们提供足够的信息。
您可能无法将所有目标文件链接在一起。
您可能正在编译一个期望C ++名称损坏的合作伙伴的文件,而另一个文件没有。所以main.o正在寻找被破坏的名称,导出它的对象是导出一个未编号的名称,反之亦然。