链接错误,即使一切都在那里

时间:2010-11-09 00:25:26

标签: c++ c visual-studio-2010 linker

我正在开发一个(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

2 个答案:

答案 0 :(得分:2)

你正在混合使用C和C ++。当您在C ++代码中包含datatrie / trie.h时,编译器会假定它是一个C ++头,但无论libdatatrie是C库还是其头文件都不是C ++友好的。

包括如下标题:

extern "C" {
#include <datrie/trie.h>
}

答案 1 :(得分:0)

有一些可能性,但您的示例并未向我们提供足够的信息。

  1. 您可能无法将所有目标文件链接在一起。

  2. 您可能正在编译一个期望C ++名称损坏的合作伙伴的文件,而另一个文件没有。所以main.o正在寻找被破坏的名称,导出它的对象是导出一个未编号的名称,反之亦然。