【问题标题】:Why does RWDBManager::database need shared library name?为什么 RWDBManager::database 需要共享库名?
【发布时间】:2011-02-07 10:01:16
【问题描述】:

我正在使用 Roguewave 库从 C++ 连接到 Sybase 数据库。我了解数据库对象的构造为:

  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". 

我不明白:

在代码中,我习惯于看到当我们必须使用库中提供的东西时,包括该库的标头,使用该库中的类/函数,然后在编译您的项目时在 LDLIBARIES 列表中使用该库。为什么这里的函数数据库需要库的NAME?与#include 方法相比,这种方法有哪些优势。

这是一些标准技术吗?这个一般用在什么地方? 我从事过使用共享库的项目,因此链接不是静态完成的,但我还没有遇到过这样的事情。

谢谢,

【问题讨论】:

  • 根据 Roguewave 数据库文档,他们正在使用 dlopen 动态加载此共享库。我的下一个问题是为什么 Roguewave 选择了这种设计。他们可能只是动态链接这个共享库,但也没有动态加载这个。
  • 编辑你的问题,就是这样:)

标签: c++ plugins linker compilation rogue-wave


【解决方案1】:

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

例如见here ...

my2c

编辑:

他们为什么选择这个设计,除了问他们,你还得猜:)

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

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

【讨论】:

  • 嗨神经,确实,Roguewave 数据库模块使用 dlopen 动态加载给定的共享库,根据 Rogueawave 文档,但是我的下一个问题是为什么 Roguewave 选择这种设计而不是只是将其保留为共享库。他们可以动态链接它,但为什么他们选择动态加载它呢?
  • @learnerforever:好吧,我想你应该问他们;)我会在我编辑的答案中给出一些猜测......
猜你喜欢
  • 2010-11-08
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多