【问题标题】:linking error on adding new file/class to ios project将新文件/类添加到 ios 项目时出现链接错误
【发布时间】:2012-10-23 02:45:55
【问题描述】:

在添加新的 .h 和 .m 文件数据解析后,我的链接构建失败,我不太明白为什么。不过,我对objective-c 比较陌生。如果我删除包含(然后我必须从需要数据解析类的文件中删除对对象的引用),那么它不会失败。只是删除对象不会剪切它,当我尝试包含文件时它仍然失败。在链接下的错误部分中,它说架构 i386 的一个重复符号

dataparsing.h 是:

//
//  dataParsing.h
//  TelnetToICC
//
//  Created by **** on 10/8/12.
//
//

#import <UIKit/UIKit.h>



@interface dataParsing : UIView
{


}
- (void)getData:NSString:id;
-(void) parseLine:id;
-(void) parseDatagram:id;
-(void) reset;

@end

char icc_data[10000];
int data_top=-1;

这个想法只是写一些简单的函数来处理字符串,所以我不想在这里做任何真正特别的事情,但我对 Objective-c 比较陌生。 ViewController.m 中数据解析的 include 是:

#import "dataParsing.h"
#import "ViewController.h"
#import <CoreFoundation/CFSocket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

@implementation ViewController

似乎我为链接器做了两次事情,但我的实验没有找到它。我注意到我的两个 .h 文件都有

#import <UIKit/UIKit.h>

但我删除了一个,它不起作用。

迈克

【问题讨论】:

  • 什么是重复符号?如果您查看完整的错误消息,该错误会告诉您。
  • /Users/adams161/Library/Developer/Xcode/DerivedData/TelnetToICC-etyvzjlseyeoijcufezdrzihcbja/Build/Intermediates/TelnetToICC.build/Debug-iphonesimulator/TelnetToICC.build/Objects-normal/i386/ViewController.o /Users/adams161/Library/Developer/Xcode/DerivedData/TelnetToICC-etyvzjlseyeoijcufezdrzihcbja/Build/Intermediates/TelnetToICC.build/Debug-iphonesimulator/TelnetToICC.build/Objects-normal/i386/dataParsing.o
  • 哦,它说复制符号_data_top in:
  • 我将 data_top 更改为 dataTop,但仍然出现错误。

标签: objective-c ios ios5


【解决方案1】:

重复的符号是_data_top。我猜也是_icc_data。问题是您在 dataparsing.h 文件中声明了一个全局变量。因此,对于包含此 .h 文件的每个文件,都会创建一个具有相同名称的新全局变量,从而导致重复符号链接器错误。

你需要做的是换行:

char icc_data[10000];
int data_top=-1;

到:

extern char icc_data[10000];
extern int data_top;

然后在 dataparser.m 文件中执行以下操作:

char icc_data[10000];
int data_top = -1;

.h 文件中的 extern 让编译器和链接器知道将在某处定义变量的一份副本。 .m 文件中的行就是这一定义。

【讨论】:

  • 当我在 .h 中这样做时,我得到 extern 对 dataTop 行有一个 intilizer 警告,而在 .m 中我得到了 dataTop 的重新定义。 icc_data 没有出错。
  • 得到如果想通了,现在构建成功。对于我在 = -1 中留下的 extern 行,当时我假设只引用变量名并最初仅在 .m 中分配它。你把它写出来了,我一开始就错过了这个区别。
  • 当我包含 char icc_data[10000] 时对 .m 感到好奇;整数数据顶部=-1;我把它放在@implemenation 上面还是下面有关系吗
  • 因为它们是全局变量而不是类的一部分,你应该把它们放在@implementation 之前。在#import 语句之后是个好地方。
  • 在我如何组织程序方面有很多值得思考的地方。但我学到了一些东西并且它正在工作。谢谢大家
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多