7

我想知道如何防止 Cygwin 下的 gcc 自动将 .exe 扩展名添加到已编译的文件中,因为我只是让自己对“丢失的文件”产生了很多困惑。就上下文而言,我正在为大学做一个 C 项目,我通常在运行 Ubuntu(与 Windows 的双启动)的实验室工作,但在家工作我更喜欢使用我的 Windows 机器,ergo Cygwin。如果我只是删除扩展,它仍然可以在任一系统上正常工作,但是每当我刚刚在 Cygwin 下编译它时必须更改命令以包含扩展,这是相当令人沮丧的。

我从 Cygwin 查找了常见问题解答,发现这可能是与 .bashrc 或 .bash_profile 中的环境变量有关的问题(请参阅此处),但我不是命令行忍者,对编辑配置文件不是很熟悉。 .我还发现了两个相关的问题,它们表现出相同的行为,但与试图改变它无关:

使用 gcc 编译(Windows 上的 cygwin)

cygwin下使用gcc生成的可执行文件

有任何想法吗?

它实际上是用于 C 项目中的 MPI,所以我有一个调用 mpicc 的 Makefile 但这与问题并不真正相关,因为我也尝试使用 gcc 并且两者都做同样的事情。对于这个问题,我得到的命令和输出是:

$ gcc -o hello hello.c
$ ls
hello.c    hello.exe
$./hello
Hello, world!
$./hello.exe
Hello, world!

请注意,使用或不使用扩展程序在 shell 中运行相同的操作,但与 mpirun 不同,这就是我想更改此行为的原因。

我最终决定 Windows 不是我的编程环境。从现在开始,所有可以在 Linux 中完成的工作都将是。

4

2 回答 2

3

7年没人告诉?

我的回答:是的,可以在 Cygwin GCC 下生成没有 .exe 扩展名的可执行文件。通过告诉链接器如何命名其输出。

$ echo -e "#include <stdio.h>\nint main(int nbargs, char *args[]) {
  printf(\"Hello \\\n\");
  }" | gcc -pipe  -x c - -Wl,-oess2

这将生成一个PE32 ess/ PE32+ 可执行文件,而不是ess.exe. 该-pipe选项指示 GCC 构建链不写入临时文件,而是在阶段之间使用管道。该-Wl,-o选项禁止默认 --force-exe-suffix

通过这种方式,您可以真正取消 Cygwin GCC 输出-Wl,-o/dev/null,尝试关闭输出时链接器将失败,但您可以捕获错误消息。如果你得到它,你可以确信 GCC 到达链接阶段足以产生输出,这意味着 GCC 可以使用此代码构建可执行文件。

从 ld 手册页:

--noinhibit-exec 保留可执行输出文件,只要它仍然可用。通常情况下,链接器在链接过程中遇到错误是不会产生输出文件的;当它发出任何错误时,它会在不写入输出文件的情况下退出。

不要-Wl,-o/dev/stdout在 Cygwin 下使用。在 Cygwin 下,/dev/stdout 是一个符号链接,如果链接器失败,它将删除/dev/stdout。

另一方面,-Wl,-o/proc/self/fd/1不会造成任何伤害,但链接器会失败,并且只会在标准输出上产生错误消息。目前,在 Cygwin 下似乎没有直接的方法来管道链接器输出,即使使用命名管道也是如此。

于 2021-03-12T16:39:12.207 回答
2

可执行文件的自动 exe 扩展是有原因的(Windows 需要它)。您应该自己解惑(又名教育:-) 并接受 Cygwin 的工作方式。这是一个深深植根于 Cygwin/Windows 内部的特性,没有它几乎不可能运行。

对于使用不同方法的“Windows 上的 Unix 感觉”,您想查看AT&T 的 UWin

于 2013-05-13T13:46:35.177 回答