如何避免iOS项目重复符号链接错误?

时间:2015-06-04 18:43:19

标签: ios objective-c frameworks duplicates linker-errors

我正在使用“适用于iPhone iPad的Brother Print SDK”开发iOS应用程序 它可以从here获得。

我将BRPtouchPrinterKit.framework拖放到我的app frameworks文件夹下 在我的应用程序中,有一个PrintViewController,我导入标题如下。

PrinterViewController.h

#import <UIKit/UIKit.h>
#import <BRPtouchPrinterKit/BRPtouchPrinterKit.h>

@interface PrintViewController : UIViewController <BRPtouchNetworkDelegate> {
    BRPtouchNetwork*            ptn;
    BRPtouchNetworkInfo*        pti;
}

BRPtouchPrinterKit / BRPtouchPrinterKit.h

#import <Foundation/Foundation.h>
#import "BRPtouchPrinter.h"
#import "BRPtouchNetwork.h"
#import "BRPtouchNetworkInfo.h"
#import "BrPtPJ673_def.h"

@interface BRPtouchPrinterKit : NSObject

@end

如果我在其他viewcontrollers中导入PrintViewController,我总是面临重复的符号错误。

SettingsViewController.m(不是头文件)

#import "PrintViewController.h"
...

链接错误:

    duplicate symbol _printerSeries in: 
    /Users/.../PrintViewController.o
    /Users/.../SettingsViewController.o

    duplicate symbol _rasterGraphicType in: 
    /Users/.../PrintViewController.o
    /Users/.../SettingsViewController.o

    ld: 2 duplicate symbols for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

符号“_printerSeries”和“_rasterGraphicType”在BRPtouchPrinter.h文件中定义。

typedef enum {
    DEFAULT_SERIES,
    PT_SERIES,
    QL_SERIES
} PRINTER_SERIES;

typedef enum {
    TYPE_DEFAULT,
    TYPE_G,
    TYPE_g
} RASTER_GRAPHIC_TYPE;
PRINTER_SERIES      printerSeries;
RASTER_GRAPHIC_TYPE rasterGraphicType;

问题:

  1. 为何发生此链接错误?
  2. 我该如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

错误是由.h文件中的这两个全局变量printerSeriesrasterGraphicType的声明引起的;如果您在多个位置包含.h文件,则会看到重复的符号。

在我看来,这实际上是兄弟的一些非常糟糕的编码;这些变量应该在某个地方适当地封装在某个对象中,但我们无法解决这个问题。

可以做的是制作这些静态变量,以便只有一个符号实例,并且链接器错误就会消失。

编辑BPRtouchPrinter.h使其为

typedef enum {
    DEFAULT_SERIES,
    PT_SERIES,
    QL_SERIES
} PRINTER_SERIES;

typedef enum {
    TYPE_DEFAULT,
    TYPE_G,
    TYPE_g
} RASTER_GRAPHIC_TYPE;

static PRINTER_SERIES      printerSeries;
static RASTER_GRAPHIC_TYPE rasterGraphicType

注意:我的代码似乎仍然可以使用这些更改,看起来它们应该是共享全局变量,所以static应该没问题,但我无法保证不会有问题。