我是实习生,我的工作是将程序从linux c移植到visual c。 我将使用Berkeley DB和Visual C ++。 尝试一段时间后,我收到链接错误
berkeleyDB.obj:错误LNK2019:未解析的外部符号“int __cdecl database_select_end(unsigned int,unsigned int,struct chunk * const,int)”(?database_select_end @@ YAHIIQAUchunk @@ H @ Z)在函数“void __cdecl”中引用op_ds_bulk(unsigned int,unsigned int *,int)“(?op_ds_bulk @@ YAXIPAIH @ Z)
中引用的未解析的外部符号“int __cdecl database_open(int,char *)”(?database_open @@ YAHHPAD @ Z)
berkeleyDB.obj:错误LNK2019:未解析的外部符号“void __cdecl database_sync(void)”(?database_sync @@ YAXXZ)在函数“void __cdecl op_ds_bulk(unsigned int,unsigned int *,int)”中引用“(?op_ds_bulk @@ YAXIPAIH @ Z)
berkeleyDB.obj:错误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 )“(?op_ds_bulk @@ YAXIPAIH @ Z)
berkeleyDB.obj:错误LNK2019:函数_main
不知道那些是什么, 请帮助我
答案 0 :(得分:1)
它们是C ++ - 受损(或“装饰”)的函数名称。 C ++允许函数重载 - 具有相同名称但具有不同参数签名的多个函数 - 因此需要将参数等编码到函数名中以区分链接时的多个重载。很可能您的DB库是作为C构建的,并且没有装饰名称。
尝试将db.h include包装在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 ++。
来自the other comment you've posted:如果您的问题是您实际上根本没有链接到Berkeley DB,那么您需要进入项目设置(右键单击项目名称),C ++链接选项卡,然后将.lib文件添加到链接到项目的库列表中。您可能还需要指定查找它的路径,并且您应该对调试和释放模式执行此操作(设置顶部的下拉菜单)。