所以,我有一个有趣的问题。我正在使用一组专有的 dll,显然我没有这些 dll 的源代码。目标是编写一个中间 dll,将来自专有 dll 的大量函数调用组合在一起。我遇到的问题是,在使用 g++ 进行编译时,原始 dll 出现如下错误: 无法导出 libname_NULL_THUNK_DATA。找不到符号。
如果我添加一个 main 并编译成一个可执行文件,一切都会按预期工作。我正在使用 mingw 进行编译。感谢您的帮助。
针对第一个回复:要么我对您所说的内容感到困惑,要么我没有很好地表达我的问题。我并没有明确尝试从我的包装器中导出任何东西,我只是从它们的 dll 中调用函数。问题是我收到错误,无法将这些特定符号从 dll 导出到我的包装器。问题是我什至不能完全确定这些 _NULL_THUNK_DATA 符号的用途。我进行了搜索并在某处阅读了它们不应导出的内容,因为它们是 Windows 使用的内部符号。我试过对链接器使用 --exclude-symbols 指令,但它似乎没有做任何事情。如果我完全误解了您的意思,我深表歉意。
所以,我认为我的问题与此有关。在编译使用 dll 的标准可执行文件时,我能够包含 header 并直接调用函数,例如:
#include :3rdparty.h
int main(){
dostuff(); // a function in the 3rdparty.dll
}
这会编译并运行良好。我只需要在 g++ 命令中链接库。 当与 -shared 标志链接时,我会得到这些错误(当然删除了 main )。我认为这与默认情况下 g++ 尝试从 dll 导入所有符号这一事实有关。我不明白的是为什么这发生在 dll 和可执行文件中。我将尝试使用 GetProcAddress() 来完成它。谢谢!
最佳答案
它应该像您认为的那样简单。
例如: 您的 dll 代码需要:
void doStuff()
{
3rdparty.login();
3rdparty.dostuff();
3rdparty.logoff();
};
到目前为止 - 非常好,您已经包含了正确的 header ....(如果有,如果没有,则需要使用 LoadLibrary() 导入库,然后创建一个指向每个 header 的函数指针使用 GetProcAddress() 导出 dll 入口点,然后调用该函数指针)
然后您可以链接到第 3 方库,仅此而已。有时,您必须使用“extern "C"”来包装定义,以便正确地进行链接名称修改。
正如您所说,您使用的是 g++,您不能与 __declspec(dllimport) 混淆,后者是 MS VC 扩展。
关于c++ - 无法编译访问另一个 dll 的 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675584/
类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
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e