2013-07-25 2 views
0

У меня возникла странная проблема при компиляции библиотеки с открытым исходным кодом. При компиляции для устройства Xcode компилирует его просто отлично и не создает никаких проблем. Однако, когда я компилирую для симулятора, я получаю дубликаты символов во время фазы связывания.Дублирующие символы только для симулятора iOS build

Я проверил несколько из них, и кажется, что эти символы были реализованы в файле .hh в отличие от файла .m. Очевидно, что это плохая структура кода, и ошибки имеют смысл. Однако, что не имеет смысла, почему есть no ошибки для сборки устройства.

Каждый из этих файлов .hh содержит #pragma один раз в верхней части файла. Моя первоначальная мысль заключалась в том, что это не работает так, как ожидалось, но после удаления я получаю ошибки времени компиляции для сборки устройства и симулятора, заявляя, что я переопределил эти символы. Хм, так что я потом пытался заменить #pragma один раз

#ifndef EXAMPLE_DEFINE 
#define EXAMPLE_DEFINE 

// code 

#end if 

Но это дает одинаковые результаты в #pragma раз.

Из-за большого количества изменений кода, которые потребуются, для меня нецелесообразно проходить и исправлять каждую ошибку вручную, тем более, что я хочу иметь возможность легко обновлять базу кода. Итак, есть ли причина, по которой это не терпит неудачу для устройства, и как я могу заставить сборки симулятора работать одинаково?

EDIT: Я также протестировали с помощью #import вместо #include, но это тоже дает те же результаты

EDIT 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

Хорошо, я обновил вопрос с журналом сборки и файлом оскорбления –

ответ

0

Это показывает, как вы пытались заголовок но мое предложение после того, как вы проверите, следуя ссылке .

http://en.wikipedia.org/wiki/Include_guard

http://c2.com/cgi/wiki?RedundantIncludeGuards

Обновление показывает, что ошибка линкера для символов, и это для библиотеки, которую вы используете.

+0

Ничто здесь не имеет никакого эффекта –

+0

ok, позвольте мне проверить .... – pradipta

+0

Проверить, что имя класса, которое вы определили, присутствует в другом месте. – pradipta

Смежные вопросы