我如何才能阻止Cygwin下的gcc添加“引用”;。exe";编译的可执行文件?

我如何才能阻止Cygwin下的gcc添加“引用”;。exe";编译的可执行文件?,c,gcc,cygwin,C,Gcc,Cygwin,我想知道如何防止Cygwin下的gcc自动将.exe扩展名添加到编译文件中,因为我只是对“缺少的文件”造成了很多混淆。作为背景,我正在为大学做一个C项目,我通常在运行Ubuntu(Windows双启动)的实验室工作,但要在家工作,我更喜欢使用我的Windows机器ergo Cygwin。如果我只是删除扩展,它在任何一个系统上都可以正常工作,但是每当我在Cygwin下编译它时,必须更改命令以包含扩展,这是相当令人沮丧的 我查阅了Cygwin的FAQ,发现这可能与.bashrc或.bash_prof

我想知道如何防止Cygwin下的gcc自动将.exe扩展名添加到编译文件中,因为我只是对“缺少的文件”造成了很多混淆。作为背景,我正在为大学做一个C项目,我通常在运行Ubuntu(Windows双启动)的实验室工作,但要在家工作,我更喜欢使用我的Windows机器ergo Cygwin。如果我只是删除扩展,它在任何一个系统上都可以正常工作,但是每当我在Cygwin下编译它时,必须更改命令以包含扩展,这是相当令人沮丧的

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

有什么想法吗

它实际上是针对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中完成的工作都将被删除。

可执行文件的自动exe扩展是有原因的(Windows需要它)。你应该解放自己,接受Cygwin的工作方式。这是一个深深植根于Cygwin/Windows系统的特性,没有它几乎不可能运行


对于“Windows上的Unix感觉”,请使用您想要查看的不同方法

7年没人知道

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

$ echo -e "#include <stdio.h>\nint main(int nbargs, char *args[]) {
  printf(\"Hello \\\n\");
  }" | gcc -pipe  -x c - -Wl,-oess2
$echo-e“#包含\n主(int-nbargs,char*args[]){
printf(\“Hello\\\n\”);
}“| gcc-管道-x c-Wl,-oess2
这将生成一个
ess
PE32/PE32+可执行文件,nota
ess.exe
-pipe
选项指示GCC构建链不编写临时文件,而是在阶段之间使用pipe。
-Wl,-o
选项禁止默认的
--force exe后缀

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

从ld手册页:

--noinhibit exec在可执行输出文件仍然可用时保留该文件。通常,如果 在链接过程中遇到错误;它不写就退出了 一个输出文件,当它发出任何错误时

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


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

您用来调用gcc的命令行是什么?这并不能回答您的问题,但您可能希望在VirtualBox这样的虚拟机上试着运行Ubuntu。这样你就不必担心这样的问题,你家里的环境也可以和你在学校的环境一模一样。如果我不修改程序的运行方式,Cygwin真的需要用扩展编译程序吗?我几乎不用它,只制作只能在Cygwin中运行的命令行程序(至少在这台机器上)。我不想在Windows中安装Unix,如果我安装了,我只想安装Unix。实际上,Windows NT内核和API不需要.exe扩展名。这就是为什么您可以从Cygwin中的程序中删除扩展,并且它仍然可以正常执行。如果将“
”添加到
PATHEXT
环境变量中,也可以让这样的程序在cmd.exe中运行,如:
set PATHEXT=。;%PATHEXT%
。但我不知道如何让它们在Windows资源管理器中工作。