Xcode:处理外部库的“重复符号”

时间:2018-02-23 00:38:11

标签: ios xcode linker

在我们的项目中,我们依赖于2个打印机库:StarIO&爱普生ePOS,在编译期间我遇到了这个错误:

duplicate symbol _GetOnlineStatus in:
/Users/brendan/Development/xxxx/Frameworks/StarIO.framework/StarIO(StarIOPort.o)
/Users/brendan/Development/xxxx/xxxxApp/SDKs/Epson/libepos2.a(eposprint_common_status.o)
ld: 1 duplicate symbol for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)

需要一些帮助以解决此问题的最佳方法。

1 个答案:

答案 0 :(得分:0)

这种情况有时可能具有挑战性 - 因为两个库似乎都使用相同的符号,因为实现可能会有所不同。解决此问题的唯一可靠方法是让每个库供应商为其库中的每个类/符号使用前缀。

除此之外,由于我假设你只有epson库(libepos2.a)的编译版本,你或者想要:

  1. 重命名StarIO.framework
  2. 中发生冲突的符号
  3. 合并两个库。
  4. 选项1:

    如果您决定只重命名导致问题的符号,请在StarIO.framework中搜索:

    GetOnlineStatus
    

    然后将它在任何地方(在12个文件中)重命名,它在该库中显示的内容略有不同:

    StarIO_GetOnlineStatus
    

    位于以下

    StarIO.framework/Versions/A/Headers/SMPort.h
    StarIO.framework/Versions/A/Headers/WBluetoothPort.h
    StarIO.framework/Versions/A/Headers/BluetoothPort.h
    StarIO.framework/Versions/A/Headers/starmicronics/StarIOPort.h
    
    StarIO.framework/Versions/Current/Headers/SMPort.h
    StarIO.framework/Versions/Current/Headers/WBluetoothPort.h
    StarIO.framework/Versions/Current/Headers/BluetoothPort.h
    StarIO.framework/Versions/Current/Headers/starmicronics/StarIOPort.h
    
    StarIO.framework/Headers/SMPort.h
    StarIO.framework/Headers/BluetoothPort.h
    StarIO.framework/Headers/WBluetoothPort.h
    StarIO.framework/Headers/starmicronics/StarIOPort.h
    

    选项2:

    另一个选择是将两个库合并为一个,尽管这可能会相当复杂并且可能会出现其他问题。有关如何执行此操作的详细信息please see this answer here on stackoverflow