静态库中的预处理器宏

时间:2011-10-17 09:15:18

标签: objective-c macros c-preprocessor

在Objective-C项目中我使用的是静态库,这个静态库的编译依赖于要设置的一些预处理器宏。

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

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

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

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

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

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

我很确定我知道发生了什么,但我愿意接受纠正。以下是MyLib在构建设置中定义MyApp(启用调试)并且LOG_LEVEL_DEBUG未定义它(禁用它)的情况。

MyLib构建时,它首先编译MyApp,其中MyLib源文件中的所有LogDebug()都被替换为MyLib(从{{1}开始没有定义)。编译no-op后,编译LOG_LEVEL_DEBUG并将MyLib源中的所有MyApp方法替换为LogDebug()语句,因为MyApp已定义在构建设置中。