【问题标题】:No exe file being generated in C using recent Cygwin versions使用最新的 Cygwin 版本在 C 中没有生成 exe 文件
【发布时间】:2015-06-25 18:11:40
【问题描述】:

GCC 4.9.2 不会创建可执行文件,a.out-o hello.exe 也不会。在编译行添加-v表示-o切换到一个不存在的临时文件,例如:-o /tmp/ccr6nMlO.s

最近几个月在 Windows XP 和 Windows 7 上安装 Cygwin NT-6.1 都未能生成可执行文件。我在一台运行良好的旧笔记本电脑上发现了 Cygwin 1.7.3。

编译标志或它们的语法是否改变了?此命令无法生成可执行文件:

gcc hello.c -o hello.exe

这是我的版本。我以为它来自 Cygwin 镜子。 $ uname -a给了

CYGWIN_NT-6.1-WOW Gary-PC 1.7.35(0.287/5/3) 2015-03-04 12:07 i686

这是一个编译示例:

$ gcc hello.c -o hello.exe

echo $? 返回一个1,没有注释。所以编译器失败了。

所有编译任何代码的尝试都无法在当前目录中生成任何内容,并且不会报告任何错误或警告。 ctgcheck -c bash binutils bzip2 cygwin gcc-core gcc-g++ gzip m4 make unzip zip 表示一切都已安装:

Cygwin Package Information
Package              Version        Status
bash                 4.3.33-1       OK
binutils             2.25-1         OK
bzip2                1.0.6-2        OK
cygwin               1.7.35-1       OK
gcc-core             4.9.2-3        OK
gcc-g++              4.9.2-3        OK
gzip                 1.6-1          OK
m4                   1.4.17-1       OK
make                 4.1-1          OK
unzip                6.0-14         OK

-v 编译得到这个报告:

$ gcc hello.c -o hello.exe -v

Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.9.2/lto-wrapper.exe 
Target: i686-pc-cygwin 
Configured with: /cygdrive/i/szsz/tmpp/gcc/gcc-4.9.2-3.i686/src/gcc-4.9.2/configure --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-4.9.2-3.i686/src/gcc-4.9.2 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --libdir=/usr/lib --datarootdir=/usr/share --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C --build=i686-pc-cygwin --host=i686-pc-cygwin --target=i686-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit --with-dwarf2 --with-arch=i686 --with-tune=generic --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,lto,objc,obj-c++ --enable-graphite --enable-threads=posix --enable-libatomic --enable-libgomp --disable-libitm --enable-libquadmath --enable-libquadmath-support --enable-libssp --enable-libada --enable-libjava --enable-libgcj-sublibs --disable-java-awt --disable-symvers --with-ecj-jar=/usr/share/java/ecj.jar --with-gnu-ld --with-gnu-as --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix --without-libintl-prefix --with-system-zlib --enable-linker-build-id 
Thread model: posix gcc version 4.9.2 (GCC) 
COLLECT_GCC_OPTIONS='-o' 'hello.exe' '-v' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.9.2/cc1.exe -quiet -v -Dunix -idirafter /usr/lib/gcc/i686-pc-cygwin/4.9.2/../../../../include/w32api -idirafter /usr/lib/gcc/i686-pc-cygwin/4.9.2/../../../../i686-pc-cygwin/lib/../../include/w32api hello.c -quiet -dumpbase hello.c -mtune=generic -march=i686 -auxbase hello -version -o /tmp/cc8W4cOy.s

我还在报告此版本的 Windows XP 上安装了 Cygwin:CYGWIN_NT-5.1 lt-love6 1.7.35(0.287/5/3) 2015-03-04 12:07 i686 Cygwin

hello.c 的编译结果相同。没有生成可执行文件,$?=1 表示编译失败。也没有报告错误或警告。使用-v 会提供与上述类似的报告。

【问题讨论】:

  • 运行gcc时是否有错误,还是返回非零返回码?每个源文件都会发生这种情况,还是仅针对您提供的 hello.c 示例?你是否使用任何库,如果有,是哪些?
  • 如果你正在安装 Cygwin NT-6.1,那不是正确的安装,我什至不知道你从哪里得到的。您使用的是 cygwin 网站上的安装程序吗?另外,我不记得 cygwin 可执行文件是作为 .exe 运行还是必须是 .out
  • @Rob:Cygwin 可执行文件以.exe 后缀命名。 Cygwin 让带有.exe 后缀的文件通过其基本名称来引用;例如hellohello.exe 是同一个文件。
  • 我相信“NT-6.1”这个名字是指 Windows 7。Cygwin 没有单一的版本号。临时文件/tmp/ccr6nMlO.s正常;那是汇编到.o 文件的汇编语言文件,然后将其链接到可执行文件中。 gcc 命令是否产生任何消息?当前目录下是否有名为hello.exe的文件?
  • "编译标志或它们的语法是否改变了?"不,您的 Cygwin 和/或 gcc 配置有问题。尝试重新安装 gcc,并记住“NT-6.1”不是 Cygwin 版本号。

标签: c windows gcc cygwin


【解决方案1】:

我也遇到过类似的问题。 此问题可能是由于使用了不兼容的 cygwin DLL 版本。 使用 Windows 开始->查找/搜索工具搜索 cygwin1.dll 并删除除最新版本以外的所有版本。最新版本应该 驻留在 x:\cygwin\bin 中,其中“x”是您拥有的驱动器 安装了 cygwin 发行版。如果您还建议重新启动 找不到另一个 cygwin DLL。

【讨论】:

    【解决方案2】:

    我不确定您是否只对拥有一个工作系统感兴趣(在这种情况下,您可以简单地重新安装 Cygwin,可能是更新的版本), 或确定取证,即确定问题的原因。

    对于第二个目标,您可以做的一件事是隔离从 hello.c 到 hello.exe 的 3 个阶段:

    1. 预处理(使用-v 表示详细程度)

      gcc -E hello.c -v -o hello.i
      
    2. 编译

      gcc -c hello.c -v -o hello.o
      

    (或者你也可以编译 hello.i)

    1. 链接

      gcc hello.o -v -o hello.exe
      

    并检查三个中的哪一个首先失败。 这可能会为您提供有关可能的失败来源的线索。

    PS:我无法重现您的问题

    $ uname -a
    MSYS_NT-10.0-WOW P522806 2.11.2(0.329/5/3) 2018-11-26 08:59 i686 Msys
    
    $ gcc --version
    gcc.exe (Rev3, Built by MSYS2 project) 8.2.0
    Copyright (C) 2018 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题(并开始了赏金),但现在通过重新安装 Cygwin 设法解决了我自己的问题。 @CristiFati 对要求澄清版本的问题添加了评论,但具有讽刺意味的是,添加赏金让我没有足够的声誉来回复 - 所以我不得不在这里回答。

      Cygwin 安装程序用于更新系统并安装 GCC 包(通过添加包 'gcc-objc++'),因为在没有 GCC 支持的情况下安装了原始 Cygwin。但是,此安装是在具有多个用户以受限权限运行的系统上进行的。我认为这会干扰升级并导致某些用户无法访问某些文件,因此 GCC 的安装已损坏。

      行为是成功的编译工作并生成了正确的目标文件,但任何错误都会静默失败,没有输出和错误消息(但退出状态为“1”)。

      解决方案是完全删除 Cygwin 并以我自己的用户身份重新安装。这确保了权限正确,因此安装/升级可以正确升级所有文件,并且 GCC 编译和错误报告现在按预期工作。

      总结一下

      • 不正确的 Windows 权限导致软件包安装问题。

      【讨论】:

        【解决方案4】:

        根据我使用过的,Cygwin 终端中的一个简单的 GCC 命令作为

        $ gcc filename.c
        

        产生输出文件“a”。您可以按如下方式运行它:

        $ ./a
        

        希望对您有所帮助。

        【讨论】:

        • 这是我的版本。它来自一个cygwin镜像。 $ uname -a CYGWIN_NT-6.1-WOW Gary-PC 1.7.35(0.287/5/3) 2015-03-04 12:07 i686 Cygwin
        • gcc filename.c 创建一个名为 a.exe 的文件。该文件也可以称为a-o 选项指定输出文件的名称。问题中给出的命令应该起作用。
        • 当前目录中没有创建任何内容。不是 a.out、a.exe 或任何名称。
        • 我什么也没得到,返回码是 1,表示 gcc 失败。
        • @red69:如果您希望我看到评论,请在 @ 符号后提及我的名字。没有那个,我可能不会收到通知。我只是看到这个,因为我碰巧再次检查了这个问题。如果您包含gcc -v 格式化为代码 的输出(复制并粘贴并使用{} 图标),我们或许可以提供帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 2023-04-07
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多