Ошибка ссылки, хотя все есть - PullRequest
1 голос
/ 09 ноября 2010

Я работаю над (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 ]

2 голосов
/ 09 ноября 2010

Вы смешиваете C и C ++.Когда вы включаете datatrie / trie.h в свой код C ++, компилятор предполагает, что это заголовок C ++, однако libdatatrie является библиотекой C и ее заголовки не являются дружественными для C ++.

Включите заголовок, например:

extern "C" {
#include <datrie/trie.h>
}
0 голосов
/ 09 ноября 2010

Есть несколько возможностей, но ваши примеры не дают нам достаточно информации.

  1. Возможно, вы не связываете все объектные файлы вместе.

  2. Возможно, вы компилируете один файл с предполагаемым партнером по именам в C ++, а другой - без.Таким образом, main.o ищет искаженное имя и объект, который его экспортирует, экспортирует незафиксированное имя или наоборот.

...