草庐IT

c++ - 使用 gcc 编译 DLL

coder 2023-11-14 原文

太棒了,我正在写一个脚本解释器。基本上,我希望一些类和函数存储在 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 解析代码,如果在所述代码中发现函数调用,则调用 DLL 中的相应函数...例如,如果我传递“a = sqrt(100)”,那么 DLL 解析器函数将找到对 sqrt() 的函数调用,并且在 DLL 中将是一个相应的 sqrt() 函数,该函数将计算平方根传递给它的参数,然后它会从该函数获取返回值并将其放入变量 a... 就像任何其他程序一样,但是如果在DLL(将有一个 native 支持的函数列表)然后它会调用一个类似的函数,该函数将驻留在使用 DLL 的程序中以查看是否有任何用户定义的具有该名称的函数。

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

最佳答案

This link解释了如何以基本方式做到这一点。

在全局 View 中,当您制作一个 dll 时,您正在制作一个在运行时加载的库。它包含许多导出的符号。这些符号通常是对方法或函数的引用,加上编译器/链接器 goo。

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

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

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

所以您的步骤是:创建您的 header 和代码,构建一个 dll,从 header /代码/一些导出函数列表构建一个 stub 库。结束代码将链接到 stub 库, stub 库将加载 dll 并修复跳转表。

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

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

关于c++ - 使用 gcc 编译 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/505567/

有关c++ - 使用 gcc 编译 DLL的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐