2011-02-07 71 views
1

我正在使用Roguewave庫從C++連接到Sybase數據庫。據我所知,數據庫對象被構造爲:爲什麼RWDBManager ::數據庫需要共享庫名稱?

RWDBManager::database("accessLib", "", "", "", "", "XA=lrm_name"); 

http://www2.roguewave.com/support/docs/sourcepro/edition8/html/dbxaug/5-3.html

All arguments are of type RWCString. Note that establishing an XA connection to the Sybase CT database requires only two of the six database() arguments, as described here: 

    accessLib 

    The argument for the first parameter is the same as that which you provide for the non-XA connection. 

    For static libraries, supply the string "SYBASE_CT". 

    For shared libraries, supply the name of your shared access library, for example "libctl420d.so". 

我不明白:

在代碼中,我看慣了,當我們不得不使用在庫中提供的東西,包括這些庫的頭文件,使用這些庫中的類/函數,然後在編譯項目時在LDLIBRARIES列表中使用這個庫。爲什麼這裏的函數庫需要庫的名字?這種方法與#include方法相比有什麼優勢。

它是一些標準技術?通常在哪裏使用? 我曾參與過使用共享庫的項目,所以沒有靜態地完成鏈接,但我沒有遇到過這種情況。

感謝,

+0

他們正根據Roguewave數據庫文檔使用dlopen動態加載此共享庫。我的下一個問題是爲什麼Roguewave選擇了這種設計。他們可能只是**動態鏈接**這個共享庫,但不能**動態加載**這一點。 – xyz 2011-02-07 14:41:37

+0

編輯你的問題,這是SO的方式:) – neuro 2011-02-07 16:15:19

回答

1

這可能是因爲他們使用動態它的名字和POSIX系統的標準調用,比如dlopen()加載庫。在Windows中有一個等價物,我認爲它是LoadLibrary()。有了這樣的系統,您可以加載庫並從中獲取符號。構建插件系統或類似的東西非常方便。它還允許你使用一些性能增強圖書館,只有當他們的存在......

here例如...

MY2C

編輯:

至於他們爲什麼選擇這樣的設計,除了問他們,你必須猜測:)

我的猜測:更容易維護插件架構中的數據庫驅動程序:更容易安裝,在版本之間切換,更容易提供二進制補丁...

另一種猜測:實現某種內省/反射的唯一方法。