2011-02-24 51 views
1

HI我是一名實習學生,我的工作是將一個程序從linux c移植到visual c。 我必須使用Berkeley DB和Visual C++。想了一會兒後 ,我得到的鏈接錯誤Berkeley DB和Visual C++的鏈接器錯誤

berkeleyDB.obj:錯誤LNK2019:無法解析的外部符號 「INT __cdecl database_select_end(unsigned int類型,unsigned int類型,結構塊* const的,INT)」(database_select_end (void __cdecl op_ds_bulk(unsigned int,unsigned int *,int)「(?op_ds_bulk @@ YAXIPAIH @ Z)引用的@@ YAHIIQAUchunk @@ H @ Z)
berkeleyDB.obj:error LNK2019:無法解析的外部符號」void __cdecl op_ds_bulk(unsigned int,unsigned int *,int)「(?op_ds_bulk @@ YAXIPAIH @ Z)引用的__cdecl database_sync(void)」(?database_sync @@ YAXXZ)
berkeleyDB.obj:error LNK2019:unresolved外部符號「void __cdecl database_insert_bluk(s (void __cdecl op_ds_bulk(unsigned int,unsigned int *,int)「(?op_ds_bulk @@ YAXIPAIH @ Z)
berkeleyDB中引用的」truct chunk *,int)「(?database_insert_bluk @@ YAXPAUchunk @@ H @ Z) OBJ:錯誤LNK2019:無法解析的外部符號 「INT __cdecl database_open(INT,CHAR *)」(?database_open @@ YAHHPAD @ Z)的函數引用_main

不知道那些是什麼, 請幫我

回答

1

他們是C++ - mangled(或'裝飾')函數名稱。 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++。

the other comment you've posted:如果你的問題是你根本沒有連接到Berkeley DB,那麼你需要進入項目設置(右鍵點擊項目名稱),C++鏈接選項卡,然後將.lib文件添加到庫列表以鏈接到您的項目。您可能還需要指定路徑以查找此信息,並且您應該爲調試和發佈模式(設置頂部的下拉列表)執行此操作。

+0

感謝您的回覆!但是當我把這個#include 放在我的extern「C」中時,它給了我錯誤無法打開include文件:'db/db.h'。我試圖把很多lib文件鏈接起來,但它仍然顯示錯誤。可能是我不知道確切的做法。你能給我一些一步一步的提示嗎?提前致謝 !!! – kevin 2011-02-25 01:32:07

+0

噢好的 - 抱歉,如果我有錯誤的頭文件名或路徑。 Berkeley數據庫頭通常被稱爲db.h或類似的東西 - 你已經將它包含在你的源代碼或你包含的其他文件之一的某處。你應該尋找這個,並把它包裝在'extern「C」'中 – Rup 2011-02-25 10:00:27