提问人:Emanuele 提问时间:5/13/2023 最后编辑:Emanuele 更新时间:5/23/2023 访问量:141
如何让 wine/Linux 对传输功能使用与 Windows 相同的精度?
How can I get wine/Linux to use the same accuracy for trascendental functions as Windows?
问:
我希望 wine/Linux 运行程序(即通过 wine 在 Linux 上运行的 Windows exe/dll)对 Microsoft 实现的传输功能(即 VS2019 等)使用相同的准确性。
我面临的挑战是,我需要通过 wine 运行的一些软件确实调用了这样的函数,我担心通过 glibc 提供的准确性/实现会产生不同的数字,并使代码最终遵循不同的路径。
我找到了一种解决方法,即加载ucrtbase.dll,如下所示native,builtin
WINEDLLOVERRIDES="ucrtbase=n,b" wine <my program>
当我通过交互式终端运行我的软件时,这非常有效。
不幸的是,如果我随后将这样的进程作为子进程运行(即 stdout 和 stderr 重定向到内存/文件),那么程序就会崩溃,因为我想它仍然认为它在终端上并尝试打印特殊颜色字符,但当然它不应该。 当然,如果我离开内置的ucrtbase.dll,它都可以作为子进程工作,但是我失去了准确性/结果。
知道我接下来该如何进行吗?我也可以自己在内置葡萄酒ucrtbase.dll中重新编译一些超越函数,使其与VS2019相同(以及进一步),唉,不确定源代码是否公开可用?
答:
最有效和最高效的方法是使用来自 Windows 安装的原始版本(包含所有超越功能)(当然,这需要您拥有许可副本)并添加到您的 wine 选项中,例如:ucrtbase.dll
WINEDLLOVERRIDES="ucrtbase=n,b" wine <your program>
这是非常谨慎的,因为只要从终端(或终端模拟器)运行,当运行时,一切都会起作用。
相反,如果必须将其输出重定向到文件,则会遇到内存损坏和/或崩溃。<your program>
为了解决这个问题,基本上有两种选择:
- 软关闭和/或调用 - 不会打印任何内容
std::cout
std::cerr
std::cout.setstate(std::ios_base::eofbit)
- 更改输出内容的位置和/或通过重定向相同的内容(沿着此答案的行)似乎现在这个库知道它不会打印到终端,因此它不会损坏流/内存
std::cout
std::cerr
这应该发生在内部,并且可以通过更改核心 DLL 之一来通过 wine 轻松实现,以便可以在程序启动时通过 DllMain/ 执行相同的内容。<your program>
DLL_PROCESS_ATTACH
这已在 RHEL 7.9 上的 wine 8.0.1 中得到验证。
评论
double