Ошибка компоновщика с Беркли DB и Visual C ++ - PullRequest
1 голос
/ 24 февраля 2011

HI Я студент-стажер, и моя работа заключается в переносе программы с linux c на visual c.Я должен использовать Беркли DB и Visual C ++.после некоторой попытки я получаю сообщение об ошибке

berkeleyDB.obj: ошибка LNK2019: неразрешенный внешний символ "int __cdecl database_select_end (без знака int, без знака int, struct chunk * const, int)" (? database_select_end @@ YAHIIQAUchunk @@ H @ Z) упоминается в функции "void __cdecl op_ds_bulk (без знака int, без знака int *, int)" (? op_ds_bulk @@ YAXIPAIH @ Z) * ​​1004 * berkeleyDB.obj: ошибка LNK2019: ошибка LNK201ссылка на символ «void __cdecl database_sync (void)» (? database_sync @@ YAXXZ) в функции «void __cdecl op_ds_bulk (unsigned int, unsigned int *, int)» (? op_ds_bulk @@ YAXIPAIH @ Z) * ​​1005 * berjleyB:ошибка LNK2019: неразрешенный внешний символ "void __cdecl database_insert_bluk (struct chunk *, int)" (? database_insert_bluk @@ YAXPAUchunk @@ H @ Z), на который ссылается функция "void __cdecl op_ds_bulk (unsigned int, unsigned int? int, int")op_ds_bulk @@ YAXIPAIH @ Z) * ​​1006 * berkeleyDB.obj: ошибка LNK2019: неразрешенный внешний символ «int __cdecl database_open (int, char *)» (? database_open @@ YAHHPAD @ Z)ссылка в функции _main

Понятия не имею, что это такое, пожалуйста, помогите мне

1 Ответ

1 голос
/ 24 февраля 2011

Они - искаженные (или «украшенные») имена функций C ++. C ++ допускает перегрузку функций - несколько функций с одним и тем же именем, но с разными сигнатурами параметров - и поэтому ему необходимо кодировать параметры и т. Д. В имя функции, чтобы различать множественные перегрузки во время соединения. Скорее всего, ваша библиотека БД была собрана как C и не будет иметь оформленных имен.

Попробуйте включить db.h в extern "C"

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

чтобы указать компилятору обрабатывать API как функции C, а не C ++.

(Похоже, там тоже есть опечатка: database_insert_bluk не _bulk.)

Кроме того, похоже, что Berkeley DB поставляет интерфейс C ++ #include <db/db_cxx.h>, который вы могли бы использовать вместо этого, хотя, если вы переносите код, может быть проще придерживаться интерфейса C. Разница, вероятно, в том, что портируемый вами код Linux был скомпилирован как C, тогда как здесь вы компилируете его как C ++.

Из другого комментария, который вы разместили : если ваша проблема заключается в том, что вы вообще не ссылаетесь в Berkeley DB, тогда вам нужно перейти в настройки проекта (щелкните правой кнопкой мыши на имя проекта), вкладка C ++ link, а затем добавьте файл .lib в список библиотек для ссылки в ваш проект. Вам может потребоваться указать путь, чтобы найти это тоже, и вы должны сделать это для режимов отладки и выпуска (выпадающий в верхней части настроек).

...