使用 gcc 编译 DLL

2024-02-05

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 可以从链接到它的程序中调用函数吗?如果我创建一个 class { ... } 对象;在DLL中,那么当程序加载DLL时,对象是否可供程序使用?提前致谢,我确实需要知道如何在 C++ 中使用 DLL,然后才能继续这个项目。

“您能否添加更多细节来说明为什么希望 DLL 调用主程序中的函数?”

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

因此,假设您将 DLL 加载到程序中,使您的程序能够解释这种特定语言的脚本,程序可以调用 DLL 来处理单行代码或将脚本的文件名交给它来处理...但是如果您想要要在脚本中添加适合程序用途的命令,您可以在 DLL 中设置一个布尔值,告诉它您正在向其语言添加函数,然后在代码中创建一个函数,该函数将列出您正在使用的函数添加(DLL 会使用它想要的函数名称来调用它,如果该函数是代码中包含的用户定义函数,则该函数将使用 DLL 传递给它的参数调用相应的函数,返回将用户定义函数的返回值返回给 DLL,如果它不存在,则会返回错误代码或 NULL 等)。我开始发现我必须找到另一种方法来解决这个问题,以使函数调用仅以一种方式进行


这个链接 http://www.cygwin.com/cygwin-ug-net/dll.html解释了如何以基本方式进行操作。

从大的角度来看,当您创建 dll 时,您正在创建一个在运行时加载的库。它包含许多导出的符号。这些符号通常是对方法或函数以及编译器/链接器 goo 的引用。

当您通常构建静态库时,会有最少的 goo,链接器会拉入所需的代码并将其重新打包到可执行文件中。

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

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

因此,您的步骤是:创建标头和代码、构建 dll、从标头/代码/导出函数的一些列表构建存根库。结束代码将链接到存根库,该存根库将加载 dll 并修复跳转表。

编译器/链接器 goo 包括确保运行时库位于需要的位置、确保执行静态构造函数、确保注册静态析构函数以供以后执行等。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gcc 编译 DLL 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 如何删除没有标签的Docker镜像?

    我使用 docker 已有 5 个月了 从来没有遇到过这个问题 我有 2 个具有相同 ID 的图像 因此我想删除我知道它已被弃用的图像 问题是它没有 ID 当我尝试这样做时 dk rmi f gitlab lab 5005 xs mgmt
  • Scala:如何使用默认值初始化对象

    我认为用一个例子可以更好地解释这一点 我有以下案例类 case class Person name String no name surname String no surname 我想创建一个通用函数来填充它 例如 一条 json 消息
  • 具有配置的类库中的 Entity Framework 7 迁移脚手架

    尝试将迁移添加到 ASP NET 5 类库中的 EF7 模型 跑步时dnx ef migration add mymigration失败并产生不同的结果 具体取决于我运行它的项目 如果我在主项目的文件夹中运行它 它无法找到DbContext
  • 返回多个值并访问它们?

    我将如何构造它以返回多个值 消息和名称 并能够在js html file code gs function createArtistTable name var message test return message and name js
  • 如何使用 Fetch API 发布身体数据?

    下面是在邮递员中导入并运行后成功返回响应的curl命令 curl request POST data grant type password data username test data password xyz1234 data sco
  • SQL命令添加数据库图表

    sql server 2008 上是否有一个 sql 命令可以运行以启用数据库图表而不是出现此对话框 该数据库没有使用数据库图表所需的一个或多个支持对象 你想创造它们吗 该脚本有点太长 无法在此处添加 但您可以执行以下操作 1 创建一个新的
  • 如何从 bode() 到达第一个和第二个图

    我知道如何使用 bode 函数创建波特图 如果我想重叠两个或多个系统频率响应 我使用 bode sys1 sys2 or hold on 例如 当我想要到达该图以便用 text 放置图例时 很容易到达第二个图 像图形指针这样的东西总是返回到
  • 错误:“不推荐使用 Window 类型中的 show() 方法”

    这是一个简单的程序 只需打开 AWT 我正在使用 eclipse 并且我收到上面显示的frame show 的错误 Eclipse 正在用一条线跨越 显示 我想要这个程序做的只是显示一个 300px x 300px 的框架窗口 完整代码如下
  • Apache 无法在 OSX 中的 MAMP 中启动(但 MySQL 可以工作)

    我已经使用 MAMP 工作了几个月 最近安装了 PostgreSQL 它还建议安装 Apache 我这样做是为了确保 PostgreSQL 正常工作 然后我卸载了 PostgreSQL 和 apache 构建并尝试重新启动 MAMP 它启动
  • 如何为 Android 制作局域网唤醒?

    你能告诉我 如何为Android制作Wake On Lan应用程序吗 我在谷歌上搜索了两周 尝试了一切 从另一个唤醒局域网应用程序下载了源代码 并尝试找到用于制作和发送魔术包的代码 看起来其他所有代码都可以工作 但是当我在我的应用程序中使用
  • 初级 Java:变量作用域问题

    我正在练习我的java书中的一些工作 并且在获取使用变量进行计算的方法时遇到问题 请注意 这是一项正在进行的工作 我目前只是试图让它使用 CircleArea 方法来计算圆的面积 这是必要的代码 public class Geometry
  • Laravel“目标 [Illuminate\Contracts\Bus\Dispatcher] 不可实例化。”

    正如标题本身所说 我遇到了以下问题 Target Illuminate Contracts Bus Dispatcher is not instantiable 我正在尝试使用自定义脚本并包含默认的 Laravel 类 require on
  • POST 请求 Fetch API 防止重定向

    所以我想制作一个纯html和javascript表单并将其提交到服务器 这是我的 html 表单代码
  • wxPython:当我关闭框架时,单选按钮如何记住我的选择

    您好 我有一个主框架和一个按钮 按下该按钮时会打开第二个框架 第二个框架有 6 个单选按钮 我的问题是 当我选择与已选择的单选按钮不同的单选按钮并关闭框架时 当我再次打开它 不关闭整个程序 时 为什么选择第一个单选按钮以及如何保留我的新选择
  • 不要将文字作为本地化参数传递

    在我的项目 Windows Phone 8 1 应用程序 上运行代码分析时 出现以下警告 CA1303 不要将文字作为本地化参数传递 方法 Common TranslateError String 将文字字符串作为调用 XDocument
  • 使用 STL 在 C++ 中实现图和 BFS

    以下是我编写的代码 include
  • 高效的数据结构,用于快速随机访问、搜索、插入和删除

    我正在寻找一种数据结构 或多个结构 它可以让我保留一个有序的整数列表 没有重复项 并且索引和值在同一范围内 我需要四个主要操作才能高效 按重要性的粗略顺序排列 从给定索引中获取值 查找给定值的索引 在给定索引处插入值 删除给定索引处的值 使
  • 如何在 ASP.NET 网页中实现 html 表单 - ASP.NET 中的两种表单问题

    请看这个html代码 div class section cc content 5 style display none div class pad content div class right grid 1 h1 Contact Add
  • AngularJS 重复 http 请求

    我正在使用 AngularJS 做一些接口 并观察 Chrome 控制台 我检测到对 API 的每个 http 请求都是重复的 有什么办法可以避免这种情况吗 这是我的简化代码 http jsonp http APIURL com api c
  • 使用 gcc 编译 DLL

    Sooooo我正在写一个脚本解释器 基本上 我希望将一些类和函数存储在 DLL 中 但我希望 DLL 在链接到它的程序中查找函数 例如 program dll send code to dll gt parse code v code co