我在研制茧足类动物。使用我的吊舱的人可以选择是否在他们的Podfile中包括这一行。
use_frameworks!
如果它们包括它,我的代码将被编译成一个.framework文件。如果没有,它将被编译成一个.a文件。
根据是否存在use_frameworks!,我想使用预处理宏在我的可可荚中包含不同的代码。
例如,如下所示:
#if PODFILE_CONTAINS_USE_FRAMEWORKS
@import My_Library;
#else
#import <My-Library/MyLibrary.h>
#end当您有一个与c99extidentifier不兼容的荚名时,就会出现这种情况。
我已经尝试过检查#if defined COCOAPODS,但这在这两种情况下都有定义。
发布于 2016-04-22 19:03:44
开始起作用了。
这个片段需要放到Podfile中:
post_install do |pi|
pi.pods_project.targets.each do |target|
target.build_configurations.each do |config|
unless pi.podfile.defined_in_file.read().include? "\nuse_frameworks!\n"
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'NO_USE_FRAMEWORKS=1'
end
end
end
end然后在源文件中,代码如下所示:
#if defined NO_USE_FRAMEWORKS
#import <My-Library/MyLibrary.h>
#else
@import My_Library;
#endif如果符号不存在,默认为@import语法。
因此,只有在不存在use_frameworks!的情况下才需要添加Podfile片段。但不管是哪种方式都会奏效。
发布于 2021-11-30 15:15:22
我也有过和你一样的问题。我想从目标C中导入Swift生成的标头,但根据库的类型(以及是否存在use_frameworks!),标题位于不同的位置。在这两种情况下,我都成功地导入了正确的文件,而不必更改Podfile。
我所做的
为了在两个静态库中导入标头(没有use_frameworks!)和动态框架(使用use_frameworks!)我用了我发现的东西here
基本上有一个编译器预处理器宏__has_include ( header-name )来确定它是否在那个特定的位置上有一个导入文件。
因此,如果文件在那里,我使用导入,否则我使用另一个导入(假设没有第三个选项)。
所以在我的例子中,导入如下所示:
#if defined __has_include && __has_include(<MyLibrary-Swift.h>)
#import <MyLibrary-Swift.h>
#else
#import <MyLibrary/MyLibrary-Swift.h>
#endif根据use_frameworks!的存在运行自定义代码
在您的示例中,您可以使用__has_include(<MyLibrary-Swift.h>)作为podfile DOESN'T contain use_frameworks!,如下所示:
#if defined __has_include && __has_include(<MyLibrary-Swift.h>)
// use_frameworks! is NOT present
#else
// use_frameworks! is present
#endif假设生成的头看起来如下所示:
https://stackoverflow.com/questions/36799759
复制相似问题