在cygwin的vi编辑器中编写第一个c程序

在cygwin的vi编辑器中编写第一个c程序,c,gcc,cygwin,printf,vi,C,Gcc,Cygwin,Printf,Vi,我[非常]不熟悉c编程和cygwin,非常感谢您的耐心。我正在为初学者使用michaelvine的C编程的PDF文件,并试图输入和编译第一个示例 以下是我在vi中写的内容: #include <stdio.h> main () { printf("\nHello World\n"); } #包括 主要() { printf(“\nHello World\n”); } 当我尝试使用gcc进行编译时,出现两个错误: 1) usr/lib/gcc/i686 pc cygwin/3.

我[非常]不熟悉c编程和cygwin,非常感谢您的耐心。我正在为初学者使用michaelvine的C编程的PDF文件,并试图输入和编译第一个示例

以下是我在vi中写的内容:

 #include <stdio.h>

main ()
{
printf("\nHello World\n");
}
#包括
主要()
{
printf(“\nHello World\n”);
}
当我尝试使用
gcc
进行编译时,出现两个错误:

1)
usr/lib/gcc/i686 pc cygwin/3.4.4.//bin/ld:新建:文件格式无法识别;作为链接脚本处理

2)
[与上述路径相同]/bin/ld:new:11:语法错误collect2:ld返回1退出状态


我非常确定我在vi中使用的实际语法是正确的(它直接来自一个示例),gcc命令也是正确的。我是错过了一个包裹还是我去cygwin的路搞砸了?有人知道这是怎么回事吗?

GCC,不管是好是坏,都会使用您传递给它的文件名来确定要执行的操作—例如,运行编译器、汇编程序或链接器,或者某种组合。由于您将源文件命名为新的,GCC假定它是一个已编译的对象,并试图链接它。将其重命名为
new.c
,或者在编译时传递
-xc
标志

作为将来的参考,使用GCC编译器驱动程序调试有趣业务的一个好方法是传递
-v
标志。如果对原始命令行执行此操作,您将看到它只是调用链接器,跳过了编译步骤。我的机器中的一个示例:

$ gcc -v new -o new.exe
Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
 /usr/llvm-gcc-4.2/bin/../libexec/gcc/i686-apple-darwin11/4.2.1/collect2 -dynamic -arch x86_64 -macosx_version_min 10.8.4 -weak_reference_mismatches non-weak -o new.exe -lcrt1.10.6.o -L/usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/x86_64 -L/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/x86_64 -L/usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1 -L/usr/llvm-gcc-4.2/bin/../lib/gcc -L/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1 -L/usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/../../.. -L/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/../../.. new -lSystem -lgcc -lSystem
ld: warning: ignoring file new, file was built for unsupported file format ( 0x20 0x23 0x69 0x6e 0x63 0x6c 0x75 0x64 0x65 0x20 0x3c 0x73 0x74 0x64 0x69 0x6f ) which is not the architecture being linked (x86_64): new
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

一个基本语法错误:

 ' main(){ ... } '
在C/C++中,您的主要功能应该是:

'int main(){ ... }'

如果不是严格正确的话,您的程序是正常的。您用来构建的命令行是什么?欢迎使用堆栈溢出。请尽快阅读这篇文章。由于问题在于编译器不理解其参数,因此问题可能是由您使用的compile命令引起的。这意味着您应该告诉我们您使用的编译命令是什么。看起来您可能有
gcc code.c new
或类似于命令行的东西,并且您当前目录中可能还有一个名为
new
的文件。是的,文件名为“new”。我使用了“gcc new-o new.exe”好的-这是你的问题。回答如下。谢谢你,卡尔!我很高兴这是一个常识问题,而不是学习新语言的问题。顺便问一下,你对学习目标c之前需要学习c有什么看法?不必要还是必要?嗯,Objective-C是C的严格超集,所以如果你学习C,你在某种程度上就是在学习Objective-C。熟悉C语言中一些“奇怪”的东西可能有助于避免枪击自己的脚。如果你已经可以用其他语言编程,我会直接去学习Objective-C和你关心的框架,而不是先绕道C;我将从目标C开始。再次感谢您的帮助-干杯,皮特