程序在cmd中工作,在cygwin中立即以状态127退出,在emacs shell中没有输出

Program works in cmd, immediately exits with status 127 in cygwin, no output in emacs shell

本文关键字:emacs 退出 shell 输出 工作 cmd cygwin 程序 状态      更新时间:2023-10-16

我有以下程序,我正在使用MinGW编译:

#include <iostream>
#include <string>
using namespace std;
int main() {
    cout << "aoeu" << endl;
    string str;
    return 0;
}

当我在Windows命令提示符下编译并运行此程序时,我按预期得到以下输出:

C:pconscell>conscell.exe
aoeu

但是,当我在 Cygwin 中运行它时,我得到以下输出(或缺少输出):

$ ./conscell.exe
$ echo $?
127

如您所见,退出代码为 127,表示找不到文件或库依赖项。 此外,当我在 emacs 中以 M-x shell 运行程序时(运行C:/Program Files/Emacs/libexec/emacs/25.3/x86_64-w64-mingw32/cmdproxy.exe ),没有输出。

当我删除string str;行时,将程序更改为:

#include <iostream>
#include <string>
using namespace std;
int main() {
    cout << "aoeu" << endl;
    return 0;
}
然后 Cygwin

和 Emacs 可以找到该文件,正如 Cygwin 输出所见证的那样:

$ ./conscell.exe
aoeu

这似乎表明在程序中使用std::string会导致它依赖于cmd可以找到的某些文件,但Cygwin和cmdproxy.exe不能。 任何关于弄清楚这些文件的帮助将不胜感激。

您应该使用依赖 walker 或类似的实用程序检查可执行文件,以确定它依赖于哪些库。然后将它们放入与可执行文件相同的文件夹中,以便无论当前环境如何都可以找到它们。请参阅动态链接库搜索顺序。或者,您可以静态链接它们。

MinGW使用GCC编译,但适用于Windows环境,因此它有时使用Windows库并为Windows架构编译。Cygwin是一个轻量级的Unix环境。

如果我没记错的话,cygwin包括MinGW或GCC。如果你想在Windows上运行你的程序,使用独立的minGW编译如果你想让它在Unix上运行,可以在Unix操作系统上工作。如果你两者都想要,我想你将不得不编译两次。使用同时使用两个编译器进行编译的生成文件。