首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测use_frameworks!编译时

如何检测use_frameworks!编译时
EN

Stack Overflow用户
提问于 2016-04-22 17:14:05
回答 2查看 216关注 0票数 5

我在研制茧足类动物。使用我的吊舱的人可以选择是否在他们的Podfile中包括这一行。

use_frameworks!

如果它们包括它,我的代码将被编译成一个.framework文件。如果没有,它将被编译成一个.a文件。

根据是否存在use_frameworks!,我想使用预处理宏在我的可可荚中包含不同的代码。

例如,如下所示:

代码语言:javascript
复制
#if PODFILE_CONTAINS_USE_FRAMEWORKS
@import My_Library;
#else
#import <My-Library/MyLibrary.h>
#end

当您有一个与c99extidentifier不兼容的荚名时,就会出现这种情况。

我已经尝试过检查#if defined COCOAPODS,但这在这两种情况下都有定义。

EN

回答 2

Stack Overflow用户

发布于 2016-04-22 19:03:44

开始起作用了。

这个片段需要放到Podfile中:

代码语言:javascript
复制
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

然后在源文件中,代码如下所示:

代码语言:javascript
复制
#if defined NO_USE_FRAMEWORKS
#import <My-Library/MyLibrary.h>
#else
@import My_Library;
#endif

如果符号不存在,默认为@import语法。

因此,只有在不存在use_frameworks!的情况下才需要添加Podfile片段。但不管是哪种方式都会奏效。

票数 3
EN

Stack Overflow用户

发布于 2021-11-30 15:15:22

我也有过和你一样的问题。我想从目标C中导入Swift生成的标头,但根据库的类型(以及是否存在use_frameworks!),标题位于不同的位置。在这两种情况下,我都成功地导入了正确的文件,而不必更改Podfile。

我所做的

为了在两个静态库中导入标头(没有use_frameworks!)和动态框架(使用use_frameworks!)我用了我发现的东西here

基本上有一个编译器预处理器宏__has_include ( header-name )来确定它是否在那个特定的位置上有一个导入文件。

因此,如果文件在那里,我使用导入,否则我使用另一个导入(假设没有第三个选项)。

所以在我的例子中,导入如下所示:

代码语言:javascript
复制
#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!,如下所示:

代码语言:javascript
复制
#if defined __has_include && __has_include(<MyLibrary-Swift.h>)
// use_frameworks! is NOT present
#else
// use_frameworks! is present
#endif

假设生成的头看起来如下所示:

  • 我的图书馆-斯威夫特->如果use_frameworks!不存在于podfile中。
  • MyLibrary/MyLibrary-Swift.h -> if use_frameworks!存在于podfile中。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36799759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档