【问题标题】:Library preprocessor macros not found in consumer project在消费者项目中找不到库预处理器宏
【发布时间】:2017-09-25 03:01:43
【问题描述】:

我有一个旧的 .a 库,名为 BULib,在库目标的 GCC_PREPROCESSOR_DEFINITIONS 中定义了一个宏 NEW_API。此宏在 lib 中用于在标头中公开某些方法,或者不使用条件编译。例如:

#ifdef NEW_API
+ (nullable NSString *)user;
#endif

在项目中使用此库时出现问题。当我想使用时

[BULib user];

我得到一个编译时错误

选择器“getUser”没有已知的类方法

如果我在项目的GCC_PREPROCESSOR_DEFINITIONS 中添加NEW_API,问题就解决了,然后我可以使用该符号并且它按预期工作。

也许我误解了库和消费者项目之间宏的使用,但我不希望这种行为。

如果 lib 已使用宏集正确编译,为什么我必须在使用者项目中设置宏?如果这不是实现这一点的方法,那是什么?

非常感谢。

【问题讨论】:

  • 你能说明引用的代码部分出现在哪个文件中吗?我怀疑您的库的 API 标头包含它们或其中的一部分。如果 lib 定义了某些函数,但标头仅在定义开关的情况下为它们提供声明......那么您需要开关。我知道 minimal reproducible example 使用 lib 并不容易,但请尝试“围绕”您的代码引号提供更多信息,类似于“M几乎C并非真的VE".

标签: ios objective-c macros c-preprocessor


【解决方案1】:

有几种可能的解决方案:

  1. 像你一样在GCC_PREPROCESSOR_DEFINITIONS中添加NEW_API
  2. 删除#ifdef NEW_API#end
  3. 在导入库头之前使用#define NEW_API
  4. BULib的类别中添加+ (nullable NSString *)user;和其他缺少的方法

我个人更喜欢第三种选择。 会是这样的:

#define NEW_API
#import <bulib.h>

【讨论】:

  • 对不起,你能多解释一下选项#3吗?谢谢!
猜你喜欢
  • 2016-05-04
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
相关资源
最近更新 更多