【问题标题】:How to execute some function in a shared library如何在共享库中执行某些功能
【发布时间】:2014-12-24 16:04:47
【问题描述】:

我想知道如果某些可执行文件或共享库中的某些函数没有一起编译,程序如何“识别”它们。我知道这听起来令人困惑,这里有一个非常详细的解释:

假设我有一个名为“A”的程序。现在我想将一些额外的编译共享库“B”放在某个指定的位置,以便“A”可以在其中运行函数,而无需更改 A 本身的代码。当然我也可以使用一些额外的文件,比如txt文件,当然源代码是可见的。我应该如何设计整个系统才能使其正常工作?

如果您将其视为游戏,E.G.纸牌游戏,情况如下。您拥有游戏,并且坚持编写纯 C++(因此您必须编译所有内容)。现在您已经拥有了已发布的游戏。但是一些 DIYer 想要在游戏中添加一些新卡(他们无法更改可执行文件本身,因为如果有多个 DIY 怎么办?)。您可以通过 txt 或 db 或其他方式完成卡片数据部分,但对于“效果”部分,您必须对其进行编码并将其编译为某种东西。编译库中主程序应该如何调用卡片“效果”函数?

顺便说一句,我知道我可以使用诸如 LUA 之类的 sript 语言或其他语言来做到这一点,但是如果我想用“编译方式”来做到这一点呢?

这里是更具体的例子:

A.cpp: int main(){ FuncA();函数B();函数C(); ... } // 和别的东西

B.cpp: int TheFunction(){ .... } // 就是这样

该程序不知道“B”的存在,但它被设计成如果我可以将B编译成某种B.so,并将其放在指定的文件夹中,“A”可以执行TheFunction ()

我知道这个声音真的很实用,但我正在考虑以下几点:

在编译 B 时,使用某种方法让编译器生成某种指向 txt 文件的函数指针列表。程序 A 读取该文件,并运行 B 中指针指向的函数。

这可能吗?还是我实际上理解错了什么?

【问题讨论】:

标签: c++ compilation


【解决方案1】:

动态链接不是 C++ 标准涵盖的内容,因此其工作方式取决于实现。例如,在 Windows 上,您将构建一个 DLL,然后使用 LoadLibrary() 动态加载它,并使用 GetProcAddress() 获取指向要调用的函数的指针。其他平台使用不同的 API 提供类似的功能。

当然,C++ 是一种静态编译语言,因此在调用函数之前,您需要知道函数的签名。您的程序必须为“插件”定义一些标准函数接口,以便在 DLL 中实现,以便能够调用在构建原始程序后编写的代码。

【讨论】:

  • 非常感谢!我从没想过会这么简单。那么一个DLL里面其实记录了一个函数或者变量名?
  • 在 Windows 上,您必须使用 __declspec(dllexport) 明确声明要导出的函数,但是是的,DLL 有一个导出函数名称及其地址的表。如果您要按名称查找它们,请声明您的函数 extern "C" 以防止 C++ 名称损坏。
猜你喜欢
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2010-10-31
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2021-09-07
相关资源
最近更新 更多