当前位置:  开发笔记 > 编程语言 > 正文

使用gcc编译DLL

如何解决《使用gcc编译DLL》经验,为你挑选了1个好方法。

Sooooo我正在写一个脚本解释器.基本上,我想要一些存储在DLL中的类和函数,但是我希望DLL在链接到它的程序中查找函数,比如,

       program                dll
----------------------------------------------------
send code to dll----->    parse code
                              |
                              v
                          code contains a function,
                          that isn't contained in the DLL
                              |
list of functions in   <------/
program
      |
      v
corresponding function,
user-defined in the
program--process the
passed argument here
      |
      \-------------->    return value sent back
                          to the parsing function

我基本上想知道,如何用gcc编译DLL?好吧,我正在使用gcc的windows端口.一旦我编译了包含我的类和函数的.dll,我如何用我的程序链接到它?如何使用DLL中的类和函数?DLL可以从链接到它的程序调用函数吗?如果我创建一个类{...}对象; 在DLL中,然后当程序加载DLL时,对象是否可用于程序?在此之前,我真的需要知道如何在继续这个项目之前使用C++中的DLL.

"你能否添加更多关于为什么你希望DLL在主程序中调用函数的细节?"

我认为该图解释了它...使用DLL的程序将一段代码传递给DLL,它解析代码,如果在所述代码中找到函数调用,则调用DLL中的相应函数...例如,如果我传递"a = sqrt(100)",那么DLL解析器函数将找到对sqrt()的函数调用,并且在DLL中将是相应的sqrt()函数,它将计算参数的平方根传递给它,然后它将从该函数获取返回值并将其放入变量a ...就像任何其他程序一样,但是如果sqrt()函数的相应处理程序是'n'在DLL中找到(将有一个本机支持的函数列表)然后它将调用一个类似的函数,该函数将驻留在程序中使用DLL来查看该名称是否存在任何用户定义的函数.

So, say you loaded the DLL into the program giving your program the ability to interpret scripts of this particular language, the program could call the DLLs to process single lines of code or hand it filenames of scripts to process... but if you want to add a command into the script which suits the purpose of your program, you could say set a boolean value in the DLL telling it that you are adding functions to its language and then create a function in your code which would list the functions you are adding (the DLL would call it with the name of the function it wants, if that function is a user-defined one contained within your code, the function would call the corresponding function with the argument passed to it by the DLL, the return the return value of the user-defined function back to the DLL, and if it didn't exist, it would return an error code or NULL or something). I'm starting to see that I'll have to find another way around this to make the function calls go one way only



1> plinth..:

此链接说明了如何以基本方式执行此操作.

在大图片视图中,当您创建一个dll时,您正在创建一个在运行时加载的库.它包含许多导出的符号.这些符号通常是对方法或函数的引用,加上编译器/链接器goo.

当你正常构建一个静态库时,只有最少的goo,链接器会提取它所需的代码并在你的可执行文件中为你重新打包它.

在一个DLL中,你实际上得到了两个最终产品(三个真正 - 只是等待):一个DLL和一个存根库.存根是一个静态库,看起来与常规静态库完全相同,除了不是执行代码,每个存根通常是对常规例程的跳转指令.常用例程加载你的dll,获取你想要调用的例程的地址,然后修补原始的跳转指令去那里,所以当你再次调用它时,你最终会进入你的dll.

第三个最终产品通常是一个头文件,它会告诉您库中数据类型的所有信息.

所以你的步骤是:创建你的标题和代码,构建一个DLL,从头文件/代码/一些导出函数列表构建一个存根库.结束代码将链接到存根库,它将加载dll并修复跳转表.

编译器/链接器goo包括确保运行时库在需要的地方,确保执行静态构造函数,确保静态析构函数注册以供以后执行等等.

现在您的主要问题是:如何在dll中编写可扩展代码?有许多可能的方法 - 一种典型的方法是定义一个纯抽象类(也就是接口)来定义一个行为,并将其传递给一个处理例程,或者创建一个例程来注册接口来做工作,然后处理例程要求注册商提供一个对象来处理它的工作.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有