[英]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.