为什么RWDBManager ::数据库需要共享库名称?

问题描述:

我正在使用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

这可能是因为他们使用动态它的名字和POSIX系统的标准调用,比如dlopen()加载库。在Windows中有一个等价物,我认为它是LoadLibrary()。有了这样的系统,您可以加载库并从中获取符号。构建插件系统或类似的东西非常方便。它还允许你使用一些性能增强图书馆,只有当他们的存在......

here例如...

MY2C

编辑:

至于他们为什么选择这样的设计,除了问他们,你必须猜测:)

我的猜测:更容易维护插件架构中的数据库驱动程序:更容易安装,在版本之间切换,更容易提供二进制补丁...

另一种猜测:实现某种内省/反射的唯一方法。