【问题标题】:Typedef redefinition error when trying to build XCode project for release尝试构建 XCode 项目以进行发布时出现 Typedef 重新定义错误
【发布时间】:2012-04-17 06:08:06
【问题描述】:

我可以在 Xcode(4.2) 中构建我的项目以进行调试而不会出现问题,但是当我想构建它以进行发布(构建以进行归档)时,我收到错误:“使用不同类型的 Typedef 重新定义(无符号整数与无符号长)” .

有问题的代码是:

#ifdef _LZMA_UINT32_IS_ULONG 
typedef long Int32; 
typedef unsigned long UInt32; 
#else 
typedef int Int32; 
typedef unsigned int UInt32; <--error on this line
#endif

您可以在以下位置查看整个文件: http://read.pudn.com/downloads166/sourcecode/zip/758136/C/Types.h__.htm

之前的定义在 CoreServices 框架的 MacTypes.h 中。

我有相同的调试和发布预处理宏,我使用的是 Apple 的 LLVM 编译器 3.0。当我尝试构建项目进行分析时,也会发生同样的错误。

知道为什么会这样吗?

【问题讨论】:

  • 我知道你认为你到处都有相同的预处理宏,但是你能把#error fail放在ifdef _LZMA_UINT32_IS_ULONG块中并确保代码永远不会被编译吗?如果您确认您可以开始跟踪原因,我觉得通过 ifdef 进行调试和发布的路径不同。
  • 您是否在调试与发布中为相同的目标进行编译(即其中一个编译为 64 位,另一个编译为 32 位或两者兼而有之?
  • @DRVic 你说得对,我在调试时只为 64 位编译,而在发布时我使用 32 位/64 位。当我只选择 64 位发布时,它构建得很好。如何让它同时编译为 32 位/64 位?

标签: xcode typedef redefinition llvm-3.0


【解决方案1】:

如果您遇到错误(编译 32 位时),您已经拥有相当于

typedef unsigned int UInt32; <--error on this line

(因此错误)所以你可以删除违规行。

显然,并非所有源代码都包含/导入 MacTypes.h,因此要同时使用它,请使用 #ifdefs 将违规行括起来,如下所示:

#ifndef __MACTYPES__
typedef unsigned int UInt32;
#endif

不幸的是,这并不完美;您需要确保如果包含 MacTypes.h,它会在此之前发生。确保这一点的一种方法是在本地 #imports 之前执行系统 ​​#imports。

【讨论】:

  • 是的,这是我想到的第一件事,但是如果我删除该行,我会在代码的其他部分收到编译器错误:“未知类型名称 UInt32”。
  • 所以我相应地修改了我的答案。不完全漂亮。不过去过那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2020-06-16
  • 2012-12-09
  • 2020-08-17
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多