在Objective-C项目中我使用的是静态库,这个静态库的编译依赖于要设置的一些预处理器宏。
当我在项目中根据库设置这些宏时,库不会看到它们。但是当我在库项目中设置它时它确实有效。
由于我想将这个库重用于其他项目,我需要根据库分别为每个项目设置预处理器宏。有解决方案吗?
答案 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
已定义在构建设置中。