我想知道如果程序没有编译在一起,程序如何“重新识别”某些可执行文件或共享库中的某些函数。我知道这听起来令人困惑,这里有一个非常详细的解释:
假设我有一个名为“A”的程序。现在我想在一些指定的位置添加一些额外的编译共享库“B”,以便“A”可以在其中运行函数,而不需要更改A本身的代码。当然我也可以使用一些额外的文件,如txt文件,当然源代码是可见的。我应该如何设计整个系统以使其可以工作?
如果你把它想象成一个游戏,E.G。纸牌游戏,这是情况。你有游戏,你坚持写纯C ++(所以你必须编译所有东西)。现在你已经有了公开的游戏。但是有些DIYer想要为游戏添加一些新卡(他们不能改变可执行文件本身,因为如果有更多的DIY那么?)。您可以通过txt或db或其他任何方式执行卡数据部分,但对于“效果”部分,您必须编写代码并将其编译为某些内容。主程序应如何在编译库中调用卡“效果”函数?
顺便说一下,我知道我可以用像LUA这样的sript语言来做这件事,但如果我想用“编译方式”做什么呢?
以下是更具体的例子:
A.cpp:int main(){FuncA(); FuncB();跳到FuncC(); ...} //和其他东西
B.cpp:int TheFunction(){....} //就是它
程序不知道“B”的存在,但是它被设计成如果我可以将B编译成某种B.so,并将其放在指定的文件夹中,“A”可以执行TheFunction ()
我知道声音确实存在,但这就是我在想的:
编译B时,使用某种方法让编译器为txt文件生成某种函数指针列表。程序A读取该文件,并运行指针指向B的函数。
这可能吗?或者我真的理解错了什么?
答案 0 :(得分:0)
动态链接不是C ++标准所涵盖的内容,因此它的工作方式取决于实现。例如,在Windows上,您将构建一个DLL,然后使用LoadLibrary()
动态加载它,并使用GetProcAddress()
获取要调用的函数的指针。其他平台使用不同的API提供类似的功能。
当然C ++是一种静态编译的语言,因此您需要先知道函数的签名才能调用它。您的程序必须为“插件”定义一些标准功能界面。在DLL中实现,以便能够调用在构建原始程序之后编写的代码。