【问题标题】:Preprocessor macros in static library静态库中的预处理器宏
【发布时间】:2011-10-17 09:15:17
【问题描述】:

在我使用静态库的 Objective-C 项目中,该静态库的编译取决于要设置的一些预处理器宏。

当我根据库在项目中设置这些宏时,库看不到它们。但是当我将它们设置在库项目中时,它确实有效。

由于我想将此库用于其他项目,因此我需要根据库分别为每个项目设置预处理器宏。有解决办法吗?

【问题讨论】:

  • 你是如何在项目中设置它们的?预处理器宏部分?我发现它不起作用
  • 查看选择的答案,这是不可能的。

标签: objective-c macros c-preprocessor


【解决方案1】:

预处理器宏仅在编译时才有意义,因此您构建的任何库都将特定于您构建库时这些预处理器宏的值。您将需要许多不同版本的库,使用预处理器宏的不同可能值构建,或者您可以切换到使用不同的方法来控制将在运行时工作的库代码的行为,例如通过库 API 设置一些适当的参数。

【讨论】:

  • 没有其他方法可以解决这个问题吗?类的结构取决于这些宏。
  • 恐怕不是——你要么在构建时定义这些东西,要么在运行时定义这些东西。目前您在构建时定义它们,因此您当前的限制。
【解决方案2】:

这本身不是一个答案,而是我在解决同样的问题时发现的一些有趣的东西。

我有一个静态库 (MyLib),其中包含用于记录 (Log.h) 的标头。我有一个使用 MyLib 的应用程序项目 (MyApp)。 Log.h 与此有些相似:

#ifdef LOG_LEVEL_DEBUG
#   define LogDebug(...) NSLog(__VA_ARGS__)
#else 
#   define LogDebug(...)
#endif

MyApp 构建设置中,我可以使用预处理器宏LOG_LEVEL_DEBUG 成功关闭和开启日志记录。当我在MyApp 中找到的源文件中使用LogDebug() 时,此方法有效。但是,使用LogDebug()MyLib 源文件不受MyApp 构建设置的影响。我必须使用 MyLib 构建设置来影响 MyLib 源文件中的 LogDebug()

我很确定我知道发生了什么,但我愿意接受更正。下面是MyApp 在构建设置中定义LOG_LEVEL_DEBUG(启用调试)而MyLib 没有定义它(禁用它)的场景。

MyApp 构建时,它首先编译MyLib,其中所有LogDebug()MyLib 源文件中被替换为no-op(因为未定义LOG_LEVEL_DEBUG)。在编译MyLib 之后,编译MyApp 并且MyApp 源中的所有LogDebug() 方法都替换为NSLog() 语句,因为LOG_LEVEL_DEBUG 是在构建设置中定义的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2015-07-31
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多