菜鸟教程小白 发表于 2022-12-12 15:28:37

ios - 如何避免iOS项目重复符号链接(symbolic link)错误?


                                            <p><p>我正在使用“Brother Print SDK for iPhone iPad”开发一个 iOS 应用。<br/>
可以从<a href="http://www.brother.com/product/dev/mobile/ios/download/index.htm#forios" rel="noreferrer noopener nofollow">here</a>获取.<br/></p>

<p>我将 BRPtouchPrinterKit.framework 拖放到我的应用程序框架文件夹下。<br/>
在我的应用中,有一个 PrintViewController,我按如下方式导入 header 。<br/></p>

<p>PrinterViewController.h</p>

<pre><code>#import &lt;UIKit/UIKit.h&gt;
#import &lt;BRPtouchPrinterKit/BRPtouchPrinterKit.h&gt;

@interface PrintViewController : UIViewController &lt;BRPtouchNetworkDelegate&gt; {
    BRPtouchNetwork*            ptn;
    BRPtouchNetworkInfo*      pti;
}
</code></pre>

<p>BRPtouchPrinterKit/BRPtouchPrinterKit.h</p>

<pre><code>#import &lt;Foundation/Foundation.h&gt;
#import &#34;BRPtouchPrinter.h&#34;
#import &#34;BRPtouchNetwork.h&#34;
#import &#34;BRPtouchNetworkInfo.h&#34;
#import &#34;BrPtPJ673_def.h&#34;

@interface BRPtouchPrinterKit : NSObject

@end
</code></pre>

<p>如果我在其他 ViewController 中导入 PrintViewController,我总是会遇到重复符号错误。<br/></p>

<p>SettingsViewController.m(不是头文件)</p>

<pre><code>#import &#34;PrintViewController.h&#34;
...
</code></pre>

<p>链接错误:</p>

<pre><code>    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)
</code></pre>

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

<pre><code>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;
</code></pre>

<p>问题:<br/></p>

<ol>
<li>为什么会出现此链接错误?<br/></li>
<li>如何避免这种情况?</li>
</ol></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>该错误是由.h文件中声明了<code>printerSeries</code>和<code>rasterGraphicType</code>这两个全局变量引起的;如您所见,如果将 .h 文件包含在多个位置,则会出现重复的符号。</p>

<p>在我看来,这实际上是 Brother 的一些非常糟糕的编码;这些变量应该被适本地封装在某个对象的某个地方,但我们无法解决这个问题。</p>

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

<p>编辑 BPRtouchPrinter.h 使其成为</p>

<pre><code>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
</code></pre>

<p><strong>注意:</strong>我的代码似乎仍然可以处理这些更改,而且它们看起来应该是共享的全局变量,所以 <code>static</code> 应该没问题,但我可以不保证不会有问题。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何避免iOS项目重复符号链接(symbolic link)错误?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/30651709/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/30651709/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何避免iOS项目重复符号链接(symbolic link)错误?