【问题标题】:Link Error, even though everything is there链接错误,即使一切都在那里
【发布时间】:2010-11-09 00:25:25
【问题描述】:

我正在开发一个 (C++) 程序,该程序必须处理与文件/目录相关的大量信息(所以或多或少我有一个路径作为键)。目前我已经尝试使用哈希表实现。考虑到数据量,这似乎工作得相当好,但在分析后我发现它们仍然是系统中最慢的链接,所以为了改进我考虑使用 Trie。

我发现以下(C 实现)http://linux.thai.net/~thep/datrie/datrie.html 并阅读那里的文档似乎相当不错。然而,在尝试编写一个简单的测试 sn-p 时,我最终遇到了一个奇怪的链接错误。

奇怪的是:有问题的函数存在(在它那里,在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

【问题讨论】:

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


    【解决方案1】:

    您正在混合使用 C 和 C++。当您在 C++ 代码中包含 datatrie/trie.h 时,编译器会假定它是 C++ 头文件,但是 libdatatrie 是 C 库,并且它的头文件对 C++ 不友好。

    包括像这样的标题:

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

    【讨论】:

    • 啊,我。谢谢!现在可以使用了。
    【解决方案2】:

    有几种可能性,但你的例子没有给我们足够的信息。

    1. 您可能没有将所有对象文件链接在一起。

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

    【讨论】:

      猜你喜欢
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 2014-11-07
      • 2016-08-07
      • 1970-01-01
      • 2021-07-05
      相关资源
      最近更新 更多