这个库可供其他程序使用:https://github.com/RetroAchievements/RASuite/tree/master/RA_Integration
我已下载已编译的程序(随编译库一起提供),它们运行正常。我的目标是对库代码进行更改,重新编译它,并用我自己编译的DLL替换已下载的已编译程序的DLL。像这样:
ProgramA.exe
|_ RA_Integration.dll < replace with my own (built)
在更改代码之前,我只是尝试编译DLL并在我下载的已编译程序中使用它。我不愿意自己重新编译程序,因为它会因为依赖等原因而工作太多。而且我也希望能够只运送&#34;运送&#34;任何想要我修复的人都可以使用DLL。
所以我已经下载了该库的源代码,成功地重新编译了它,但是当我使用它而不是程序附带的那个时,它们没有启动(Windows事件查看器说有问题)加载我的DLL)。
我假设我的系统与构建原始DLL的系统存在差异,这就是它失败的原因。我的问题是:我可以找到这些差异吗?虽然我是一名专业的.NET程序员(因为它是我的工作),但我是一名C ++新手,我无法理解所有那些似乎提供不同构建/结果的链接器/预编译器/依赖项/ c ++的东西。一台机器到另一台机器。
我能够找到的是项目属性中的平台工具集&#34;是&#34; Visual Studio 2013 - Windows XP(v120_xp)&#34;因此我安装了Visual Studio 2013(使用Update 5,因为看起来基础VS2013中没有Windows XP支持)但这似乎还不够。我正在运行Windows 10,这肯定不是几年前编译DLL时原始程序员使用的操作系统,但不确定这是否重要?
是否有任何可以从DLL本身或项目中找到的东西可以提示我在我的系统上需要什么?
希望这是有道理的。
由于
答案 0 :(得分:1)
在更改代码之前,我只是尝试编译DLL并在我下载的已编译程序中使用它。我不愿意自己重新编译程序,因为它会因为依赖等原因而工作太多。而且我也希望能够将DLL“发送”给任何想要我修复的人。
这是你的谬论:你的DLL是一个链接依赖。您必须重新构建您的应用程序,因为很明显,库的ABI发生了变化,使其与您的程序试图在其期望所处的功能中调用的内容不兼容DLL。
没有办法利用你宝贵的编程知识构建一个兼容ABI的包装DLL :)找到这些差异很难 - 因为,你可以从你的DLL中导出符号列表,它基本上包含所有的DLL“提供”的函数,但是这些函数需要调用的某些方面实际上并不是其中的一部分,并且只能由链接器(或者技术人员在他们手上花费太多时间和不健康的痴迷)来扣除。从C ++源代码中解析其中的东西。
换句话说:您改变了运行时链接程序的方式。您现在必须重建您的程序。选项结束!