如何在Cygwin下停止gcc添加" .exe"编译可执行文件?

时间:2013-05-13 13:34:23

标签: c gcc cygwin

我想知道如何防止Cygwin下的gcc自动将.exe扩展名添加到编译文件中,因为我只是让自己与“丢失的文件”混淆了很多。对于上下文,我正在研究大学的C项目,我通常在运行Ubuntu的实验室工作(使用Windows进行双启动),但是在家工作我更喜欢使用我的Windows机器ergo Cygwin。如果我只删除扩展,它在任一系统上仍然可以正常工作,但是只要我在Cygwin下编译它就必须更改命令以包含扩展名。

我从Cygwin查找了FAQ,发现它可能是与.bashrc或.bash_profile(see here)中的环境变量相关的问题,但我不是命令行忍者而且不是很熟悉编辑配置文件...我发现两个相关的问题也显示相同的行为,但与尝试更改它无关:

Compiling with gcc (cygwin on windows)

Executable file generated using gcc under cygwin

有什么想法吗?

编辑:它实际上是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中完成的所有工作都将是。谢谢大家。

2 个答案:

答案 0 :(得分: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

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

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

来自 ld 手册页:

<块引用>

--noinhibit-exec 保留可执行输出文件,只要它仍然可用。通常,如果出现以下情况,链接器将不会生成输出文件 在链接过程中遇到错误;它不写就退出 出现任何错误时的输出文件。

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

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

答案 1 :(得分:2)

可执行文件的自动exe扩展是有原因的(Windows需要它)。你应该自己去解雇(也就是教育:-)并接受Cygwin的工作方式。这是一个深深扎根于Cygwin / Windows内容的功能,如果没有它,几乎不可能让它运行。

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