程序在 cmd 中运行,在 cygwin 中立即退出,状态为 127,在 emacs 中无输出 shell
Program works in cmd, immediately exits with status 127 in cygwin, no output in emacs shell
我有以下程序,我正在使用 MinGW 编译它:
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "aoeu" << endl;
string str;
return 0;
}
当我在 Windows 命令提示符下编译和 运行 这个程序时,我按预期得到以下输出:
C:\p\conscell>conscell.exe
aoeu
然而,当我在 Cygwin 中 运行 它时,我得到以下输出(或没有输出):
$ ./conscell.exe
$ echo $?
127
如您所见,退出代码为127,表示找不到文件或库依赖项。此外,当我 运行 在 emacs 中 M-x shell
中的程序(运行s 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 不能。任何有关确定这些文件的帮助将不胜感激。
MinGW 使用 GCC 编译,但适用于 Windows 环境,因此它有时会使用 windows 库并针对 windows 架构进行编译。
Cygwin 是一个轻量级的 Unix 环境。
如果我没记错的话,cygwin 包括 MinGW 或 GCC。
如果你想 运行 你的程序在 Windows 上用独立的 minGW 编译
如果你想让它在 Unix 上 运行 工作在 Unix OS 上。
如果你想要两者,我认为你将不得不编译两次。使用与两个编译器一起编译的 makefile。
您应该使用 dependency walker 或类似实用程序检查您的可执行文件,以确定它依赖于哪些库。然后将它们放入与可执行文件相同的文件夹中,以便无论当前环境如何都能找到它们。参见 Dynamic-Link Library Search Order。或者,您可以静态 link 它们。
我有以下程序,我正在使用 MinGW 编译它:
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "aoeu" << endl;
string str;
return 0;
}
当我在 Windows 命令提示符下编译和 运行 这个程序时,我按预期得到以下输出:
C:\p\conscell>conscell.exe
aoeu
然而,当我在 Cygwin 中 运行 它时,我得到以下输出(或没有输出):
$ ./conscell.exe
$ echo $?
127
如您所见,退出代码为127,表示找不到文件或库依赖项。此外,当我 运行 在 emacs 中 M-x shell
中的程序(运行s 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 不能。任何有关确定这些文件的帮助将不胜感激。
MinGW 使用 GCC 编译,但适用于 Windows 环境,因此它有时会使用 windows 库并针对 windows 架构进行编译。 Cygwin 是一个轻量级的 Unix 环境。
如果我没记错的话,cygwin 包括 MinGW 或 GCC。 如果你想 运行 你的程序在 Windows 上用独立的 minGW 编译 如果你想让它在 Unix 上 运行 工作在 Unix OS 上。 如果你想要两者,我认为你将不得不编译两次。使用与两个编译器一起编译的 makefile。
您应该使用 dependency walker 或类似实用程序检查您的可执行文件,以确定它依赖于哪些库。然后将它们放入与可执行文件相同的文件夹中,以便无论当前环境如何都能找到它们。参见 Dynamic-Link Library Search Order。或者,您可以静态 link 它们。