【问题标题】:C++ library compiles but does not work like previous versionC++ 库编译但不像以前的版本那样工作
【发布时间】:2016-07-22 08:59:35
【问题描述】:

有这个库被其他程序用作参考:https://github.com/RetroAchievements/RASuite/tree/master/RA_Integration

我已经下载了已编译的程序(与已编译的库一起提供)并且它们工作正常。我的目标是对库代码进行更改,重新编译它并用我自己编译的 DLL 替换我下载的编译程序的 DLL。像这样:

ProgramA.exe
 |_ RA_Integration.dll   < replace with my own (built)

在更改代码之前,我只是尝试编译 DLL 并在我下载的已编译程序中使用它。我不愿意自己重新编译程序,因为它会因为依赖等原因工作太多。而且我也希望能够将 DLL “运送”给任何想要我修复的人。

所以我已经下载了那个库的源代码,自己重新编译成功但是当我使用它而不是程序附带的那个时,它们没有启动(Windows事件查看器说有问题加载我的 DLL)。

我假设我的系统与构建原始 DLL 的系统存在差异,这就是它失败的原因。我的问题是:我能找到这些差异吗?虽然我是一名专业的 .NET 程序员(因为这是我的工作),但我是一名 C++ 新手,我无法理解所有那些似乎会从一台机器到另一台机器提供不同构建/结果的链接器/预编译器/依赖项/C++ 东西.

我所能找到的是,在项目属性中,“平台工具集”是“Visual Studio 2013 - Windows XP (v120_xp)”,因此我安装了 Visual Studio 2013(带有更新 5,因为它似乎是 Windows XP基本 VS2013 中不存在支持)但这似乎还不够。我运行的是 Windows 10,这肯定不是最初程序员几年前编译 DLL 时使用的操作系统,但不确定这是否重要?

是否可以从 DLL 本身或项目中找到任何可以提示我在系统上需要什么的东西?

希望这是有道理的。

谢谢

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

    在更改代码之前,我只是尝试编译 DLL 并在我下载的已编译程序中使用它。我不愿意自己重新编译程序,因为它会因为依赖等原因工作太多。而且我也希望能够将 DLL “运送”给任何想要我修复的人。

    这是您的谬误:您的 DLL 是链接依赖项。您必须重新构建您的应用程序,因为很明显,库的 ABI 发生了变化,导致它与您的程序尝试调用的功能不兼容 DLL。

    没有办法使用您宝贵的编程知识构建一个与 ABI 兼容的包装 DLL :) 很难找到这些差异 - 因为,例如,您可以从 DLL 中导出一个符号列表,该列表基本上包含所有DLL“提供”的函数,但需要如何调用这些函数的某些方面实际上并不是其中的一部分,只能由链接器(或手头有太多时间并且对从 C++ 源代码解析他们头脑中的东西。

    换句话说:您更改了运行时链接程序的对象。您现在必须重建您的程序。选项结束!

    【讨论】:

    • 谢谢,但我不明白;我没有对代码进行任何更改,那么 ABI 是如何更改的?也许我对 ABI 的定义有误;但我认为只有更改数据结构或函数定义等才会改变。只要没有这样的代码更改(在我的情况下根本没有代码更改)它不应该保持不变吗?
    • @Nicolas 编译器更改,预处理器定义更改...您需要 100% 确保您的构建等同于原始 DLL 构建(尤其是在 Windows 上,这是地狱)。
    • 有什么/任何工具我可以用来确保这样的要求吗?项目中有什么?有什么方法可以“重新设计” DLL 并找出我需要确保的设置?
    • @Nicolas 恐怕不会。
    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多