如何在共享库中执行某些函数

How to execute some function in a shared library

本文关键字:执行 函数 共享      更新时间:2023-10-16

我想知道,如果某个可执行程序或共享库中的某个函数没有一起编译,程序如何"重新编译"它们。我知道这听起来很困惑,这里有一个更详细的解释:

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

如果你把它看作是一场游戏,例如一场纸牌游戏,情况如下。你有这个游戏,你坚持纯C++编写(所以你必须编译所有内容)。现在你已经有了公开的游戏。但一些DIY者想在游戏中添加一些新卡(他们无法更改可执行文件本身,因为如果有不止一个DIY呢?)。您可以通过txt或db或其他方式来完成卡数据部分,但对于"效果"部分,您必须对其进行编码并编译。主程序应该如何调用编译库中的卡片"效果"函数?

顺便说一句,我知道我可以用像LUA之类的srpt语言来做这件事,但如果我想用"编译的方式"做呢?

下面是一个更具体的例子:

A.cpp:int main(){FuncA();FuncB();FuncC();…}//和其他

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

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

我知道这种声音真的很有影响力,但我想的是:

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

这可能吗?或者我真的理解错了什么?

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

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