如何让wine/Linux使用与Windows相同的trascendental函数精度?

cczfrluj  于 2023-05-28  发布在  Linux
关注(0)|答案(1)|浏览(145)

我希望Wine/Linux运行程序(即Windows exe/dll运行在Linux上通过葡萄酒),以使用相同的准确性为Trascendental功能实现的微软(即VS 2019等)。
我面临的挑战是,我需要通过wine运行的一些软件确实调用了这样的函数,我担心通过 glibc 提供的准确性/实现会产生不同的数字,并使代码最终遵循不同的路径。
我找到了一个解决方法,就是将 ucrtbase.dll 作为native,builtin加载,如

WINEDLLOVERRIDES="ucrtbase=n,b" wine <my program>

当我通过交互式终端运行我的软件时,这工作得很好。
不幸的是,如果我然后运行这样的进程作为子进程(即 stdoutstderr 重定向到内存/文件),然后程序崩溃,因为我猜它仍然认为它是在终端上,并试图打印特殊的 * 颜色 * 字符,但当然它不应该。当然,如果我离开 builtin**ucrtbase.dll,它都可以作为子进程工作,但这样我就失去了准确性/结果。
你知道我下一步该怎么做吗?我也可以在 builtin wine ucrtbase.dll 中重新编译一些超越函数,使其与VS 2019(以及更进一步)相同,唉,不确定源代码是否公开?

k4emjkb1

k4emjkb11#

最有效和高效的方法是使用来自Windows安装的原始ucrtbase.dll(包含所有超越函数)(当然需要您拥有许可副本)并添加到您的 wine 选项,例如:

WINEDLLOVERRIDES="ucrtbase=n,b" wine <your program>

这是一个严重的警告,因为当<your program>运行时,只要它从 * 终端 *(或 * 终端模拟器 *)运行,一切都将正常工作。如果你不得不将它的输出重定向到一个文件,你将遇到内存损坏和/或崩溃。
为了解决这个问题,基本上有两种选择:
1.通过调用std::cout.setstate(std::ios_base::eofbit)软关闭std::cout和/或std::cerr-不会打印任何内容
1.通过重定向std::cout和/或std::cerr的内容(沿着this answer的路线)来改变输出内容的位置,现在这个库 * 理解 * 它没有打印到终端,因此它不会损坏流/内存
这应该发生在<your program>内部,并且可以通过 wine 通过更改核心 * DLL * 之一轻松实现,以便在程序启动时通过DllMain/DLL_PROCESS_ATTACH执行相同的操作。
这已经在 RHEL 7.9 上的 wine 8.0.1 中得到验证。

相关问题