更详细的说明(对于较小的版本,请最后检查TL; DR):
我创建了一个在Github中可用的框架。其中有7个宏,用于定义应如何编译框架。我不能只将它们替换为static const
,因为其中的6个宏用于在编译时从框架中删除某些内容。
这些宏可以分成几组:
组1)使用框架(如果可用)
#define USE_THE_METAL_FRAMEWORK_WHEN_AVAILABLE true
#define USE_THE_OPENGL_FRAMEWORK_WHEN_AVAILABLE true
这些定义使框架即使没有添加到项目中也使用Metal和OpenGL框架。使用dlopen
完成。以下是更多详细信息:
我使用它是因为只有那些框架可用时才可以使用它们,因此开发人员可以为macOS 10.6构建他/她的应用程序,并且如果系统中可用则仍然使用Metal。问题是:如果您的应用程序二进制文件在某个地方调用了dlopen
,则您无法将其添加到Apple Store(即使您并未真正使用使用它的函数),因此用户应该能够删除该文件。从他们的代码如果愿意。删除了一些框架功能,但使其能够提交。
第2组)我正在导入框架
#define IM_IMPORTING_THE_METAL_FRAMEWORK false
#define IM_IMPORTING_THE_OPENGL_FRAMEWORK false
那些定义使框架真正使用Metal和OpenGL框架,而无需使用dlopen
。这样,就可以将其提交到Apple Store并仍然使用之前提到的功能。
第3组)行为更改
#define USER_NOTIFICATIONS_SHOULD_SHOW_A_BIGGER_ICON true
#define NSDEBUGLOG_SHOULD_PRINT_TO_A_DESKTOP_FILE_TOO true
第一个也可能在Apple Store中引起问题,第二个仅用于调试目的。
最后...
第4组)应在Apple Store中发布
#define I_WANT_TO_BE_RELEASED_IN_APPLE_STORE false
那个用于那个:
#if I_WANT_TO_BE_RELEASED_IN_APPLE_STORE == true
#define USER_NOTIFICATIONS_SHOULD_SHOW_A_BIGGER_ICON false
#define USE_THE_METAL_FRAMEWORK_WHEN_AVAILABLE false
#define USE_THE_OPENGL_FRAMEWORK_WHEN_AVAILABLE false
#endif
它会自动禁用可能导致Apple Store出现问题的三个定义。
尽管如此,例如使用Travis-CI的人无法更改框架,除非他们将其完全复制到项目中。为了解决这个问题(或至少减少它),例如,可以通过主项目中的文件来更改这7个定义中的5个。如果有人有其他解决问题的建议,我在听。
(可选)如果可以通过警告用户(通过Xcode或编译时错误)警告用户他/她需要设置那些很好的变量,因为这样做可以避免问题与可能需要设置这些宏的用户。
TL; DR:是否可以在不修改框架本身的情况下更改框架中某些宏的值?
答案 0 :(得分:0)
不。做一些方法,用一些参数初始化你的模块。但是无论如何,您将无法使用dlopen。