如何解决从 WSL 和 Linux 交叉编译导致缺少入口点 DeleteCriticalSection
我正在尝试使用 i686-w64-mingw32-gcc
从 WSL 和 Linux 交叉编译到 Win32。该程序依赖于我下载的一些 DLL:s,并且在用于在 Cygwin 上交叉编译的 exe 时可以工作。编译和链接工作不会抛出任何错误或警告,但是当我在 Windows 上运行生成的可执行文件(通过在资源管理器窗口中双击它)时,我得到一个 Windows 错误提示:
The procedure entry point DeleteCriticalSection could not be located in the DLL...
然后它指向程序(.exe
)本身,而不是 DLL(消息翻译自瑞典语;-)。
当我在 Cygwin 上使用相同的 DLL:s 存档和相同的 DLL:s 执行完全相同的操作时,生成的 exe 可以正常工作。
新的(ish)Dependencies 为 COMCTL32 和 OLEAUT32 显示了一些红线,但两者都是相同的。
一个非常简单的 Windows GUI 应用程序会编译并运行,因此导致问题的不是交叉编译。 DLL:s 与 WSL/Ubuntu/GNU 交叉编译的结合似乎是罪魁祸首。
说明
编辑:在明确遵循我自己的说明并明确重新安装交叉编译工具链后,以下说明不再创建错误的 exe。但原来的问题依然存在。
我很乐意就下一步尝试的内容提出任何想法。
这里是重复我所拥有的说明。在 WSL 中创建一个空目录并运行
$ sudo apt install binutils-mingw-w64-i686 gcc-mingw-w64-i686
$ wget https://github.com/DavidKinder/Windows-Glk/releases/download/1.50/WindowsGlk-150.zip
$ unzip WindowsGlk-150.zip
然后使用以下内容创建startup.c
#include <unistd.h>
#include "glk.h"
#include "WinGlk.h"
int winglk_startup_code(const char* cmdline)
{
return 1;
}
void glk_main(void) {
sleep(10);
}
(修正 Glk.c 中“glk.h”的大写包含,否则你会得到一个错误。)
编译并链接
$ i686-w64-mingw32-gcc -mwindows -I Include/ Glk.c startup.c Glk.lib
获得 a.exe
。该消息仅在 Gui 模式下显示,因此您需要从资源管理器窗口运行它:
explorer.exe .
然后双击 a.exe
。
WSL 和 Linux 与 Cygwin
我在“真正的”Ubuntu 20.04 上进行了相同的交叉编译,但遇到了同样的问题。同样,在 Cygwin 中执行完全相同的步骤会生成一个可运行的 exe。这指出了一些方面的交叉编译问题 exe 和 DLL:s 正在做什么。 (exe 中没有对临界区执行任何操作的代码。这可能是 API 不匹配吗?)
由于 DLL:s 是相同的,因此怀疑我的程序中源的实际交叉编译是合理的。
Linux 上的交叉编译工具链中是否有任何可能不同的内容?目标是哪些 Windows 运行时和 API 版本?
我很乐意就下一步尝试的内容提出任何想法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。