【问题标题】:How can I stop gcc under Cygwin from adding ".exe" to compiled executables?如何阻止 Cygwin 下的 gcc 将“.exe”添加到已编译的可执行文件?
【发布时间】:2013-05-13 13:34:23
【问题描述】:

我想知道如何防止 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 中完成的工作都将是。

【问题讨论】:

  • 你用来调用 gcc 的命令行是什么?
  • 这不能回答您的问题,但您可能想尝试在 VirtualBox 等虚拟机中运行 Ubuntu。这样您就不必担心任何此类问题,您的家庭环境可以与您在学校的环境完全一样。

标签: c gcc cygwin


【解决方案1】:

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 是一个符号链接,如果链接器失败,它将删除 /dev/stdout。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果我不修改程序的运行方式,Cygwin 真的需要用扩展编译程序吗?我几乎不使用它,只制作只能在 Cygwin 中运行的命令行程序(至少在这台机器上)。我不希望在 Windows 中安装 Unix,如果我这样做了,我只会安装 Unix。
    • 实际上 Windows NT 内核和 API 不需要 .exe 扩展名。这就是为什么您可以从 Cygwin 中的程序中删除扩展并且它仍然可以正常执行的原因。如果您添加“.”,您也可以让这样的程序在 cmd.exe 中运行。到PATHEXT 环境变量,如下所示:set PATHEXT=.;%PATHEXT%。我不知道如何让它们在 Windows 资源管理器中工作。
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2011-05-07
    • 2020-10-03
    • 2011-10-26
    相关资源
    最近更新 更多