重复符号仅适用于iOS模拟器版本
Duplicate symbols only for iOS simulator build
编译开源库时遇到一个奇怪的问题。当为设备进行编译时,Xcode对其进行了很好的编译,并且部署它没有问题。然而,当我为模拟器编译时,在链接阶段会出现重复的符号错误。
我已经检查了其中的一些符号,这些符号似乎都是在.hh文件中实现的,而不是在.m文件中。显然,这是一个糟糕的代码结构,错误是有道理的。然而,没有意义的是,为什么设备构建没有错误。
这些.hh文件中的每一个都在文件顶部包含一次#pragma。我最初的想法是,这并没有像预期的那样工作,但在删除后,我收到了设备和模拟器版本的编译时错误,说明我重新定义了这些符号。嗯,所以我试着用替换#pragma一次
#ifndef EXAMPLE_DEFINE
#define EXAMPLE_DEFINE
// code
#end if
但这会产生一次与#pragma相同的结果。
由于需要大量的代码更改,我不可能手动检查并修复每个错误,尤其是因为我希望能够轻松更新代码库。那么,这对设备来说没有失败的原因吗?我如何才能让模拟器构建以同样的方式执行?
编辑:我也使用#import而不是#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);
}
};
};
这表明您已经尝试了头保护,但我的建议是,一旦您检查以下内容链接
http://en.wikipedia.org/wiki/Include_guard
http://c2.com/cgi/wiki?RedundantIncludeGuards
更新显示这是符号的链接器错误,这是您正在使用的库的错误。
- 如何在c++中实现处理器调度模拟器
- 使用ios:ate写入到流会覆盖现有文件
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 询问在设计我的手臂模拟器功能表示格式1
- 如何访问RTCVideoRenderer的帧?(ios)
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- ios::fmtflags 在 C++ 中是如何工作的?setf() 是如何工作的?
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 'string'文件在带有C++文件的iOS插件上找不到
- 使用 Qt 链接到 iOS 模拟器上的静态库时不兼容的架构
- 不同的std::random_shuffle算法导致iOS模拟器单元测试失败
- Siphon为iOS模拟器构建,但为设备构建获得链接错误
- OpenGL ES深度缓冲区渲染(iOS模拟器与真实设备)
- 在 iOS 模拟器中使用库:与 Unix 一致性层链接
- Cocos 2dx游戏无法在Mac OS 64位上运行,但在iOS模拟器上运行
- 重复符号仅适用于iOS模拟器版本
- 如何在OS X 10.8.4上为iOS模拟器(6.1)编译Boost 1.54.0(1.54)
- 如何在iOS模拟器上执行任意预构建的二进制文件