2014-10-29 41 views
0

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

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

如果你把它想象成一个游戏,E.G.一场纸牌游戏,这里就是情况。你有这个游戏,并且你坚持写纯粹的C++(所以你必须编译所有东西)。现在你已经有了公开的游戏。但是一些DIYer想要在游戏中添加一些新的卡(他们不能改变可执行文件本身,因为如果有更多的那个DIY呢?)。您可以通过txt或db或其他方式来完成卡数据部分,但对于“效果”部分,您必须对其进行编码并将其编译为某些内容。主程序应该如何在编译的库中调用卡“效果”功能?

顺便说一句,我知道我可以用像LUA这样的简单语言来完成它,但是如果我想以“编译的方式”来做呢?

下面是更具体的例子:

A.cpp:INT主(){FuncA的行(); FuncB();跳到FuncC(); ...} //和别的

B.cpp:INT TheFunction(){...} //这是它

程序不知道的 “B” 的存在,但它如果我可以编译B到某种B.so,并将其放在指定的文件夹中,“A”可以执行TheFunction()我知道声音真的可以使用,但这是我我在想:

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

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

+0

阅读微软的COM:http://en.wikipedia.org/wiki/Component_Object_Model。 – Kevin 2014-10-29 03:10:25

回答

0

动态链接不是由C++标准覆盖的东西,所以这是如何工作的,取决于实现。在Windows上,例如,您将生成一个DLL,然后使用LoadLibrary()动态加载它,并使用GetProcAddress()获取要调用的函数的指针。其他平台使用不同的API提供类似的功能。

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

+0

非常感谢!我从来没有想过这会很简单。所以一个DLL实际上在里面记录一个函数或变量名? – ZisIsNotZis 2014-10-29 11:57:55

+0

在Windows上,您必须使用__declspec(dllexport)明确声明要导出哪些函数,但是,DLL具有导出函数及其地址的名称表。如果您打算按名称查找它们,请声明您的函数extern“C”以防止C++名称变形。 – mattnewport 2014-10-29 14:07:55