c++ - 显式动态链接 dll 时使用 std::unique_lock 会破坏 XP 兼容性

标签 c++ windows c++11 dll crt

我正在努力升级一个稍旧的 C++ 项目以使用 C++11(可能是 C++14)。我正在尝试尽可能多地使用标准,因为这个项目是跨平台的(Win、Mac、Linux)并且 Boost 不是一个选项。

该项目是一个SDK,需要支持Windows XP SP3及以上版本。 它在 Visual Studio 2015 中使用 v140_xp CRT。

我发现了一个问题,如果我使用某些 C++11 函数,例如 std::unique_lock,CRT 会将 .tls 部分(线程本地存储)添加到 .dll 中。虽然,更具体地说,只有当我在 unique_lock 上调用 .lock/.unlock() 时,因为似乎只使用 unique_lock 使它本质上成为一个没有问题的 std::lock_guard。

除 XP 和 Server 2K3 外,任何版本的 Windows 上的 TLS 都没有问题,只有当您显式动态链接 dll(使用 LoadLibrary)时才会出现这些问题。如果您使用 .lib 文件隐式链接,那么一切都很好,因为隐式 .tls 被转换为链接二进制文件,但如果使用显式链接,您会从 LoadLibrary 获得 Windows 错误代码 998。

这里详细解释了 XP 上的隐式 tls 问题:Nynaeve: Thread Local Storage, part 6

由于我使用的是XP兼容的CRT,没想到会遇到XP不兼容的问题,比如这个。我(个人)认为这是 XP 版本的 CRT 中的错误,因为它不完全与 XP 兼容。

有人遇到过这个问题吗?是否有任何已知的解决方法(除了推出我自己的所有 CRT 函数版本,这些函数在后台使用 TLS)?

由于这是一个 SDK,它需要作为旧版本的替代品(我静态链接运行时)并且我不能添加要求我们的客户重写他们的代码以不使用 LoadLibrary。

最佳答案

尝试禁用线程安全静态初始化: /Zc:threadSafeInit-

它使用线程本地存储: Access violation on static initialization

我打赌 std::unique_lock 使用静态变量。

关于c++ - 显式动态链接 dll 时使用 std::unique_lock 会破坏 XP 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209449/

相关文章:

C++抽象类无法实例化

c++ - 解决多定义的内联函数是一个定义明确的东西吗?

c++ - 新的运算符分配函数顺序连续性和初始值

c++ - 用户输入值,但任意值打印到屏幕。打印值与输入值不匹配

c# - 在 Windows 和 Linux 上部署时异步 TcpClient 连接不同

我可以使用共享读写打开吗?

windows - 如何在 Windows 中运行 json-server?

c++ - ISO C++ 禁止在 Arduino c 串行通信中比较指针和整数 [-fpermissive] 错误

c++ - 如何使用WinAPI在C++中制作带有标签旋转框的窗口

c++ - 使用 ASCII 值确定 A 是否是 B 的排列