繁体   English   中英

静态库中的预处理器宏

[英]Preprocessor macros in static library

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

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

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

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

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

我有一个静态库( 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM