2015-10-19 106 views
1

我试图获得Cadventure-txt进行编译,但我一直收到Undefined symbols for architecture x86_64错误。我读到SO来找到一个可能的解决方案,但迄今为止,无济于事。体系结构x86_64的未定义符号:Cadventure-txt

我没有改变github上可用的文件。如果任何人都可以理解下面的错误,这将非常好:)我对C和编程颇为陌生,所以我对从何处开始调试这样的错误没有太多线索。

以下是完整的错误:

开始 ld
Undefined symbols for architecture x86_64: 
    "_is_command", referenced from: 
     _init in main.o 
     _play in main.o 
    "_is_letter", referenced from: 
     _init in main.o 
     _play in main.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
+0

你应该提供产生这个错误的编译命令。 – Martin

+0

@Martin:我使用Xcode,它在我构建时发生。如果我尝试将它编译为命令行,我使用:'gcc Cadventure-txt.c -o cadventure adventure.story' –

+0

您无法使用'gcc'编译'adventure.story'。它不是'c'文件。这会给你另一个错误。 – Martin

回答

1

这两个函数_is_command_is_letter定义为inline

你说你使用XCode作为编译器,它使用了Clang。

默认情况下,Clang在GNU C11模式下构建C代码,因此它使用inline关键字的标准C99语义。在C99中,内联意味着函数的定义仅用于内联,并且程序中还有其他定义(不带内联)。

但是程序中没有这些函数的其他定义,因此链接时未定义符号的错误。

一些解决方案:

  • 定义功能static inline
  • 删除inline
  • 添加函数的非内联定义。
  • 在GNU C89模式下编译为std=gnu89

阅读更多关于此here

0

误差线来自ld,链接器。

它说它无法找到您使用使用的符号(即函数名称)可能,你只是没有链接到包含这些函数的文件。

相关问题