2013-07-25 110 views
0

編譯開放源代碼庫時出現奇怪問題。在爲設備編譯時,Xcode編譯它就好,並且它沒有問題。但是,當我爲模擬器編譯時,在鏈接階段會出現重複的符號錯誤。僅適用於iOS模擬器版本的重複符號

我檢查了其中的一些,看來這些符號都是在.hh文件中實現的,而不是.m文件。顯然這是錯誤的代碼結構,錯誤是有道理的。但是,沒有任何意義的是爲什麼設備構建中存在錯誤沒有

這些.hh文件中的每一個都在文件頂部包含一次#pragma。我最初的想法是,這不能按預期工作,但一旦刪除,我得到編譯時錯誤的設備和模擬器的構建,說明我已經重新定義了這些符號。嗯,所以我然後嘗試更換#pragma一次

#ifndef EXAMPLE_DEFINE 
#define EXAMPLE_DEFINE 

// code 

#end if 

但是,這會產生與#pragma一次相同的結果。

由於需要進行大量代碼更改,因此我不能手動完成並修復每個錯誤,特別是因爲我希望能夠輕鬆更新代碼庫。那麼是否有任何理由說這不是設備失敗的原因,以及如何讓模擬器構建以同樣的方式執行?

編輯:我也用替代的#include#進口檢驗,但它也得到了相同的結果

編輯2:更多的測試後,我發現,如果我在定義一個預處理宏目標的構建設置,#ifndef中的代碼永遠不會被調用,如預期的那樣。無論出於何種原因,它看起來像在.hh文件中定義新定義不會被轉入下一個文件編譯。

此外,根據要求,這裏是從生成日誌摘錄

duplicate symbol __ZZN12DelegateFuncIFvR16DualTextMenuItemRKN5Input5EventEEEC1IZN25MultiChoiceSelectMenuItem4initEPPKciiibSB_P12ResourceFaceEUlS1_S5_E_EERKT_PNSt3__19enable_ifIXntsr3std11is_functionISG_EE5valueEvE4typeEENKS8_ISF_EUlRKNS7_7StorageES1_S5_E_cvPFvSR_S1_S5_EEv in: 
    /Users/riley.testut/Library/Developer/Xcode/DerivedData/GBA4iOS-dqkflotukruucqbxjyslhtfuekse/Build/Intermediates/GBA4iOS.build/Debug-iphonesimulator/GBA4iOS.build/Objects-normal/i386/Main-FB93852047D42061.o 
    /Users/riley.testut/Library/Developer/Xcode/DerivedData/GBA4iOS-dqkflotukruucqbxjyslhtfuekse/Build/Intermediates/GBA4iOS.build/Debug-iphonesimulator/GBA4iOS.build/Objects-normal/i386/OptionView.o 
duplicate symbol __ZZN12DelegateFuncIFbiRKN5Input5EventEEEC1IZN15MultiChoiceView4initER19MultiChoiceMenuItemb9_2DOriginEUliS3_E_EERKT_PNSt3__19enable_ifIXntsr3std11is_functionISC_EE5valueEvE4typeEENKS6_ISB_EUlRKNS5_7StorageEiS3_E_cvPFbSN_iS3_EEv in: 
    /Users/riley.testut/Library/Developer/Xcode/DerivedData/GBA4iOS-dqkflotukruucqbxjyslhtfuekse/Build/Intermediates/GBA4iOS.build/Debug-iphonesimulator/GBA4iOS.build/Objects-normal/i386/Main-FB93852047D42061.o 
    /Users/riley.testut/Library/Developer/Xcode/DerivedData/GBA4iOS-dqkflotukruucqbxjyslhtfuekse/Build/Intermediates/GBA4iOS.build/Debug-iphonesimulator/GBA4iOS.build/Objects-normal/i386/OptionView.o 
duplicate symbol __ZZN12DelegateFuncIFvR12TextMenuItemRKN5Input5EventEEEC1IN14YesNoAlertView2noMUlS1_S5_E_EEERKT_PNSt3__19enable_ifIXntsr3std11is_functionISB_EE5valueEvE4typeEENKS8_ISA_EUlRKNS7_7StorageES1_S5_E_cvPFvSM_S1_S5_EEv in: 
    /Users/riley.testut/Library/Developer/Xcode/DerivedData/GBA4iOS-dqkflotukruucqbxjyslhtfuekse/Build/Intermediates/GBA4iOS.build/Debug-iphonesimulator/GBA4iOS.build/Objects-normal/i386/ButtonConfigView.o 
    /Users/riley.testut/Library/Developer/Xcode/DerivedData/GBA4iOS-dqkflotukruucqbxjyslhtfuekse/Build/Intermediates/GBA4iOS.build/Debug-iphonesimulator/GBA4iOS.build/Objects-normal/i386/MenuView.o 
ld: 16 duplicate symbols for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

,這裏是有問題的文件之一(AlertView.hh):

#pragma once 

#include <gui/View.hh> 
#include <gui/MenuItem/MenuItem.hh> 
#include <util/gui/BaseMenuView.hh> 
#include <util/rectangle2.h> 
#include <util/DelegateFunc.hh> 

class AlertView : public View 
{ 
public: 
    constexpr AlertView() { } 
    Rect2<GC> labelFrame; 
    Gfx::Text text; 
    BaseMenuView menu; 
    Rect2<int> rect; 

    Rect2<int> &viewRect() { return rect; } 

    void init(const char *label, MenuItem **menuItem, bool highlightFirst); 
    void deinit() override; 
    void place() override; 
    void inputEvent(const Input::Event &e) override; 
    void draw(Gfx::FrameTimeBase frameTime) override; 
}; 

class YesNoAlertView : public AlertView 
{ 
public: 
    YesNoAlertView() { } 
    typedef DelegateFunc<void (const Input::Event &e)> InputDelegate; 

    MenuItem *menuItem[2] = {nullptr}; 

    // Optional delegates 
    InputDelegate &onYes() { return onYesD; } 
    InputDelegate &onNo() { return onNoD; } 

    void init(const char *label, bool highlightFirst, const char *choice1 = nullptr, const char *choice2 = nullptr) 
    { 
     yes.init(choice1 ? choice1 : "Yes"); menuItem[0] = &yes; 
     no.init(choice2 ? choice2 : "No"); menuItem[1] = &no; 
     assert(!onYesD); 
     assert(!onNoD); 
     AlertView::init(label, menuItem, highlightFirst); 
    } 

    void deinit() override 
    { 
     logMsg("deinit alert"); 
     AlertView::deinit(); 
     onYesD = {}; 
     onNoD = {}; 
    } 

    InputDelegate onYesD; 
    InputDelegate onNoD; 
private: 
    TextMenuItem yes 
    { 
     [this](TextMenuItem &, const Input::Event &e) 
     { 
      auto callback = onYesD; 
      removeModalView(); 
      if(callback) callback(e); 
     } 
    }; 
    TextMenuItem no 
    { 
     [this](TextMenuItem &, const Input::Event &e) 
     { 
      auto callback = onNoD; 
      removeModalView(); 
      if(callback) callback(e); 
     } 
    }; 
}; 
+0

請發佈顯示愚蠢的生成日誌。 – trojanfoe

+0

好的我已經更新了構建日誌和違規文件的問題 –

回答

相關問題