Berkeley DB XML是一個開源的嵌入式的原生XML(native-XML)數據庫。它對外提供多種訪問接口,如C++、Java、Perl、Python、PHP、Tcl、Ruby等。在使用C++接口的過程中并非一帆風順,如有一處設置不當就可能導致失敗。這里筆者將整個過程中遇到的問題寫了出來,希望對后面的使用者有所幫助。
在自己建立工程操作Berkeley DB XML數據庫時需要引用到該數據庫的很多DLL,這個跟訪問SQL Server等數據庫是不一樣的,因為 Berkeley DB XML是嵌入式數據庫,它跟應用程序運行在相同的地址空間,處于同一個進程。
這里以Visual Studio.net 2003的C++環境為例。
1.創建工程。先新建一個空白的解決方案Solution1,然后在該解決方案中新建一個Win32控制臺項目Test,工程會自動生成很多文件。保留Test.cpp,其他文件全部刪除。
2.添加Berkeley DB XML頭文件。頭文件的位于C:\Program Files\Oracle\Berkeley DB XML 2.3.10\include(默認安裝路徑),將下面的所有文件拷貝至Test目錄下。
3.添加lib和DLL文件。lib位于C:\Program Files\Oracle\Berkeley DB XML 2.3.10\lib目錄下,共四個libdbxml23.lib、libdb45.lib、xerces-c_2.lib和xqilla10.lib。DLL位于C:\Program Files\Oracle\Berkeley DB XML 2.3.10\bin目錄下,共有四個分別為libdbxml23.dll、libdb45.dll、xerces-c_2_7.dll和xqilla10.dll。注意,將lib拷貝到Test目錄下,DLL拷貝到Test/Debug(要先生成一下項目才會產生這樣一個目錄)目錄下。
4.編寫測試代碼
/* file Test.cpp */
#include <dbxml/DbXml.hpp>
using namespace DbXml;
int main(int argc, char **argv)
{
// An empty string means an in-memory container, which
// will not be persisted
std::string containerName = "";
std::string content = "<hello>Hello World</hello>";
std::string docName = "doc";
try {
// All BDB XML programs require an XmlManager instance
XmlManager mgr;
XmlContainer cont = mgr.createContainer(containerName);
// All Container modification operations need XmlUpdateContext
XmlUpdateContext uc = mgr.createUpdateContext();
cont.putDocument(docName, content, uc);
// Now, get the document
XmlDocument doc = cont.getDocument(docName);
std::string docContent;
std::string name = doc.getName();
docContent = doc.getContent(docContent);
// print it
std::cout << "Document name: " << name << "\nContent: " <<
docContent << std::endl;
// In C++, resources are released as objects go out
// of scope.
} catch (XmlException &xe) {
std::cout << "XmlException: " << xe.what() << std::endl;
}
return 0;
}
5.設置工程屬性。
打開工程屬性頁,
(1)將預編譯頭設置為”不使用預編譯頭”;
(2)添加附加包含目錄,例如D:\sourcecode\Solution1\Test(Test工程所在目錄)
(3)添加附加依賴項。包括libdbxml23.lib libdb45.lib xerces-c_2.lib xqilla10.lib。
6.運行。這時你會發現程序崩潰,根本無法運行。
這時默認是在Debug模式,你將它改為Release模式,嘿,成功了。事實上遠沒有這么簡單,如果到此為止的話,這邊文章也就沒有寫的必要了。
我們編寫程序不可能在Release下整吧,程序是調出來的啊。因此必須搞定Debug模式下的運行問題。可能你剛才在拷貝lib文件時已經發現C:\Program Files\Oracle\Berkeley DB XML 2.3.10\lib下還有另外四個lib文件。與前面提到的四個文件的區別是文件名后面多了一個d,很明顯這是用于調試的。
那么是不是把上面的lib文件替換為這四個文件(libdbxml23d.lib、libdb45d.lib、xerces-c_2D.lib、xqilla10d.lib)就可以了呢?沒那么簡單!你還需要打開Berkeley DB XML的源代碼工程,然后在Debug模式下生成一邊(編譯Berkeley DB XML源代碼很簡單,這里不多述),這時你就能在C:\Program Files\Oracle\Berkeley DB XML 2.3.10\dbxml\build_windows\Debug下找到這四個調試版的文件(libdbxml23d.dll、libdb45d.dll、xerces-c_2_7D.dll、xqilla10d.dll)。
如果說把上面DLL文件替換為這四個DLL就可以了,我也沒有寫這篇文章的必要了。好,不管怎么說先把上面提到的八個文件替換了再說。這時當然要將工程屬性中的附加依賴項改為” libdbxml23d.lib libdb45d.lib xerces-c_2D.lib xqilla10d.lib”。然后開始生成解決方案比運行,你會發現問題依然沒有解決,在Debug模式還是存在程序崩潰的問題。
我一一查看項目配置屬性以及是否有什么DLL沒有加載全還是什么其他之類的原因,最后終于解決。原來代碼生成中有個選項”運行時庫”,系統默認是” 單線程調試(/MLd)”,這里一定要選擇” 多線程調試 DLL (/MDd)”這一項。