【发布时间】:2016-02-19 08:53:17
【问题描述】:
最近我发现,如果可执行文件和 dll 是用不同的编译器编译的,甚至是使用不同版本的 same 编译器,甚至是不同的 强>相同编译器!说我很惊讶就是无话可说——一直以来我都认为我可以创建一个动态库并安全地分发它。
现在有了这些知识,我想知道某些库是如何工作的?让我们在 system32 文件夹中获取一个 dll。使用依赖项 Walker,我可以看到,在 d3d11.dll 函数中使用 C 参数公开 - 我猜这是 C 约定,它为我们提供了保证它会工作的保证。我也知道d3d11 可以与COM 对象一起使用,因此不存在在 dll 中创建对象并在 exe 中销毁它的风险。
但是现在让我们使用任何Qt dll - 导出为c++ 的函数,并修改它们的所有名称。我记得当我安装框架时,我指定了我的编译器 - MSVC2013,但我没有指定版本!我可以在update5 编译器中使用用update1 编译器编译的dll,但我不记得有任何奇怪的行为。那么它是如何工作的呢?他们如何处理损坏的函数名称解析、参数传递?
【问题讨论】: