【问题标题】:Writing first c program in vi editor in cygwin在cygwin的vi编辑器中编写第一个c程序
【发布时间】:2013-06-19 21:21:02
【问题描述】:

我对 c 编程和 cygwin [非常] 新手非常感谢您的耐心。我正在为初学者使用 Michael Vine 的 C 编程 PDF 并尝试输入和编译第一个示例。

这是我在 vi 中写的:

 #include <stdio.h>

main ()
{
printf("\nHello World\n");
}

当我尝试使用 gcc 进行编译时,出现两个错误:

1) usr/lib/gcc/i686-pc-cygwin/3.4.4./... /bin/ld:new: file format not recognized; treating as linked script

2) [same path as above]/bin/ld:new:11: syntax error collect2: ld returned 1 exit status

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

【问题讨论】:

  • 你的程序没问题,如果不是严格正确的话。你用来构建的命令行是什么?
  • 欢迎来到 Stack Overflow。请尽快阅读FAQ。由于问题是编译器不理解其参数,因此问题很可能是由您使用的编译命令引起的。这意味着您应该告诉我们您正在使用的编译命令是什么。看起来你可能有gcc code.c new 或类似于命令行的东西,并且你的当前目录中可能还有一个名为new 的文件。
  • 是的,文件名是“新的”。我使用“gcc new -o new.exe”
  • 好的 - 那是你的问题。在下面回答。

标签: c gcc cygwin printf vi


【解决方案1】:

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

为了将来参考,使用 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

【讨论】:

  • 谢谢卡尔!我很高兴这是一个常识问题,而不是学习新语言的问题,哈哈。顺便说一句,您对在学习目标 c 之前需要学习 c 有什么看法?不必要的还是必要的?
  • 嗯,Objective-C 是 C 的严格超集,所以如果你学习 C,那么你正在在某种程度上学习 Objective-C。熟悉 C 语言中的一些“奇怪”的东西可能有助于避免误伤自己。如果你已经可以用其他语言编程,我会直接去学习 Objective-C 和你关心的框架,而不是先绕道 C 语言。
  • 绝对有道理;我将从Objective C开始。再次感谢您的帮助。 -干杯皮特
【解决方案2】:

一个基本的语法错误:

 ' main(){ ... } '

在 C/C++ 中,您的主要功能应该是:

'int main(){ ... }'

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2013-08-10
    • 2010-12-18
    • 2011-04-21
    • 2011-05-28
    • 2011-05-07
    • 2020-08-30
    • 2012-12-14
    • 2016-06-23
    相关资源
    最近更新 更多