为什么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方法相比有什么优势。
它是一些标准技术?通常在哪里使用? 我曾参与过使用共享库的项目,所以没有静态地完成链接,但我没有遇到过这种情况。
感谢,
答
这可能是因为他们使用动态它的名字和POSIX系统的标准调用,比如dlopen()
加载库。在Windows中有一个等价物,我认为它是LoadLibrary()
。有了这样的系统,您可以加载库并从中获取符号。构建插件系统或类似的东西非常方便。它还允许你使用一些性能增强图书馆,只有当他们的存在......
见here例如...
MY2C
编辑:
至于他们为什么选择这样的设计,除了问他们,你必须猜测:)
我的猜测:更容易维护插件架构中的数据库驱动程序:更容易安装,在版本之间切换,更容易提供二进制补丁...
另一种猜测:实现某种内省/反射的唯一方法。
他们正根据Roguewave数据库文档使用dlopen动态加载此共享库。我的下一个问题是为什么Roguewave选择了这种设计。他们可能只是**动态链接**这个共享库,但不能**动态加载**这一点。 – xyz 2011-02-07 14:41:37
编辑你的问题,这是SO的方式:) – neuro 2011-02-07 16:15:19