【发布时间】: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后缀的文件通过其基本名称来引用;例如hello和hello.exe是同一个文件。 -
我相信“NT-6.1”这个名字是指 Windows 7。Cygwin 没有单一的版本号。临时文件
/tmp/ccr6nMlO.s正常;那是汇编到.o文件的汇编语言文件,然后将其链接到可执行文件中。gcc命令是否产生任何消息?当前目录下是否有名为hello.exe的文件? -
"编译标志或它们的语法是否改变了?"不,您的 Cygwin 和/或 gcc 配置有问题。尝试重新安装 gcc,并记住“NT-6.1”不是 Cygwin 版本号。