c - mingw make 在运行可执行文件时给出错误代码-107374181
问题描述
我在 Windows 下的 CI 遇到了一些问题(在我自己的 Windows 安装下没有出现任何问题)。我使用 GitHub Actions 作为 CI 提供者。
当 make 尝试使用 cmd.exe 作为 shell 运行与某个 DLL 链接的可执行文件(在与同一个 DLL 链接的早期调用中似乎工作正常)时,它会导致以下输出(根据mingw32-make -d
):
Creating temporary batch file C:\Users\RUNNER~1\AppData\Local\Temp\make3992-9.bat
Batch file contents:
@echo off
cd lib && ..\\test\\unit\\gencore_test.exe
cd lib && ..\\test\\unit\\gencore_test.exe
CreateProcess(C:\Users\RUNNER~1\AppData\Local\Temp\make3992-9.bat,C:\Users\RUNNER~1\AppData\Local\Temp\make3992-9.bat,...)
Putting child 000000000245A570 (gencore_test) PID 38130688 on the chain.
Live child 000000000245A570 (gencore_test) PID 38130688
Reaping losing child 000000000245A570 PID 38130688
mingw32-make: *** [test/unit/gencore_test.mk:8: gencore_test] Error -1073741819
Cleaning up temp batch file C:\Users\RUNNER~1\AppData\Local\Temp\make3992-9.bat
Removing child 000000000245A570 PID 38130688 from chain.
(DLL包含在lib
文件夹中,这就是我cd
在调用exe之前进入它的原因。)
这个错误发生在main
被调用之前(因为我有一个调用puts
作为第一条语句),这让我认为这是 lib 加载器的问题。
我只能假设这是一个伪造的错误代码,显然在网上搜索它没有产生任何结果,尽管我没有搜索 make 或 mingw 源代码以查看它是否曾被提及。
如果我SHELL
用sh.exe
它替换它会给出错误 2816,这在我的个人 Windows 安装中也不会发生,并且没有在 MSDN 上记录为已知错误(文档从 2404 跳到 3000)。
我认为这与 DLL 有关,因为它发生在程序运行时之前,但是链接到同一个库的其他可执行文件工作正常这一事实让我认为这可能是构建过程中的一个问题 - 所以这里是编译和链接可执行文件:
clang -c -std=c17 -DWIN=1 -DDWN=2 -DLNX=3 -DBSD=4 -DPLATFORM=WIN -g -O0 -DMODE=DEBUG -D_MT -D_DEBUG -Igenesis/gencore/include -Igenesis/vendor/c11compat/mesa/include -Igenesis/vendor/dirent/include -o test/unit/gencore/main.o test/unit/gencore/main.c
clang -o test/unit/gencore_test.exe test/unit/gencore/main.o -lshlwapi.lib -Wl,-nodefaultlib:libcmt.lib -llibcmtd.lib -fPIE -Llib -lgencore
(其中一些可能无关紧要,但它可能会导致我不知道的深奥冲突,所以我把它留在了里面)
事实上,它在我自己的安装中使用相同的调用运行良好,并且考虑到我专门安装了 Windows 来解决这个问题,并且尽可能接近普通安装(使用与 CI 等相同的 llvm 版本)。 ) 让我认为它是 GitHub 操作方面的配置内容?但是话又说回来,有些可执行文件可以工作,有些则不能,所以它真的悬而未决。
如果您知道这里发生了什么并能够提供帮助,非常感谢您
存储库在这里:https ://github.com/Th3T3chn0G1t/GenesisEngine ,虽然构建系统相当复杂,所以如果我错过了一个细节或需要澄清的东西,我可以在这里提炼出来。
解决方案
我最终找到了答案——事实证明 Github CI 可能会发生一些文件系统损坏,这是一个已知问题,此后类似的问题开始出现在我的 Linux CI 中。
我的解决方案只是禁用 CI 并稍后重新启用它,以便可能获得不同的主机。
推荐阅读
- json - 用于 put 操作的 Node.js 服务
- php - BasicNetwork.performRequest:意外响应代码 400 Yii2,Android,Volley
- c++ - 无法在 Meson 构建中使用 C++ `std::filesystem` 库
- ssl - 如何使用 rtps_discovery 发现其他域名主机
- neo4j - 在 Neo4J 中执行 GraphQL 查询时出错
- asp.net-ajax - IIS 服务器上的 ashx 和 ajax 文件问题
- php - 如何将 wordpress 设置为主域,将 laravel 设置为子域?
- java - 如何在没有转义序列的 JSON 对象中写入文件路径列表
- python - 将熊猫数据框的第一行转换为列名
- angular - 如何在 Angular 6 中使用 google transstate 和货币对话 api?