gpt4 book ai didi

c++ - 分布式 dll 和 c++ 对象 - 一些库如何处理这个?

转载 作者:行者123 更新时间:2023-11-28 05:49:50 24 4
gpt4 key购买 nike

最近我发现,如果可执行文件和 dll 是使用不同的编译器编译的,甚至使用不同版本的相同编译器,甚至使用不同的< strong>相同 编译器!说我很惊讶就是什么也没说 - 一直以来我都认为我可以创建一个动态库并安全地分发它。

有了这些知识后,我想知道某些库是如何工作的?让我们在 system32 文件夹中获取一个 dll。通过 dependency Walker,我可以看到,例如,d3d11.dll 函数使用 C 参数公开 - 我猜这是 C 约定,它给了我们保证它会起作用。我还知道 d3d11COM 对象一起工作,因此没有在 dll 中创建对象并在 exe 中销毁它的风险。

但现在让我们使用任何 Qt dll - 导出为 c++ 的函数,并将它们的所有名称都打乱。我记得当我安装框架时我指定了我的编译器 - MSVC2013,但我没有指定版本!我可以在 update5 编译器中使用用 update1 编译器编译的 dll,我不记得有任何奇怪的行为。那它是如何工作的呢?他们如何处理损坏的函数名称解析、参数传递?

最佳答案

Windows 下的库必须使用相同的编译器编译的通常原因是 C++ 标准库在不同版本的 MSVC++ 之间不兼容 ABI。如果一个库跨 dll 边界使用 C++ 标准库,这是可以的,只要 C++ 标准库在该库和使用该库的编译器中是相同的。

Qt 公开了自己的字符串 (QString) 和 vector (QVector) 等,而不是 std::string 和 std::vector,因此 Qt 不通过 dll 边界公开 C++ 标准库,因此 Qt dll 可以工作适用于所有版本的 Visual Studio。

关于c++ - 分布式 dll 和 c++ 对象 - 一些库如何处理这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35501071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com