建立
我创建了一个包含C库(CommonCrypto)和Objective C文件的swift框架.
swift项目中没有bridge-header.所以我创建了一个module.modulemap将CommonCrypto和Objective-C文件导入我的swift框架.
这是module.modulemap示例链接:在swift框架中导入CommonCrypto
问题表明
我尝试了很多解决方案,但仍然没有用.
类似的问题:
有人有一个很好的解决方案吗?谢谢!!
目前我正在尝试优化我的模块图.问题是我无法将我的框架添加到我的项目中,因为我在swift框架中使用了一个obj-c框架.我在我的modulemap中添加了Obc-c头文件并使模块工作,并且可以成功地将我的框架添加到我的项目中.问题是我不能使用我的标题的realative路径.使用绝对路径只是一个临时解决方案,而不是工人友好.
对了,我不必设置这种绝对路径:
header "/Users/me/Documents/framework_project/Folder/OBJC_LIB.framework/Headers/someHeader.h"
Run Code Online (Sandbox Code Playgroud)
我在我的框架项目中将此模块图添加为私有模块映射.我的这项工作有这样的选择吗?
header "./Folder/OBJC_LIB.framework/Headers/someHeader.h"
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我的module.modulemap文件看起来像这样:
module CompanyInternalSDK {
header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found
header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
^
Run Code Online (Sandbox Code Playgroud)
当我使用没有波浪号的绝对路径时,它编译得很好,但由于这将像这样分发给所有开发人员,我想使用波浪号。有什么办法可以使这项工作正常进行吗?
我还尝试在header字符串中使用环境变量,但这也不起作用:
module CompanyInternalSDK {
header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found
header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
^
Run Code Online (Sandbox Code Playgroud) module environment-variables tilde-expansion swift module-map
我想将 OpenSSL 绑定到我的 Swift 客户端代码。我现在使用的是在模块映射中引用的伞头:
module COpenSSL [system] {
header "copenssl.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
它copenssl.h位于同一个目录中,它只是一系列包含#include <openssl/conf.h>. 有了所有需要的编译器标志,它可以完美地工作:我能够从中导入COpenSSL和使用符号。
但是,我担心代码中的另一个间接级别。我怀疑是否真的有必要。如果我放下伞头,那copenssl.h,然后将包含的内容粘贴到模块映射中,如下所示:
module COpenSSL [system] {
header "openssl/conf.h"
/* ...and more */
export *
}
Run Code Online (Sandbox Code Playgroud)
然后它再也找不到标题,即使所有标志都相同。感觉编译器只搜索模块映射目录,不尊重项目的搜索路径设置。
该文件说:
可以通过绝对路径或相对于当前地图文件的路径来引用该文件。
— http://clang.llvm.org/docs/Modules.html#module-declaration
但我对硬编码路径犹豫不决,因为它阻碍了跨平台性。
我应该只使用伞头,还是有什么方法可以让编译器查看-I路径?
目前,我们已经使用多个目标对 Swift 项目进行了模块化。目标编译为 .framework 文件,这些文件是更高目标的依赖项。我们有一个 Common 模块目标、一些 Product 模块目标和原始 App 目标。Common 将包含非常低级的代码、共享库以及可能由多个产品目标共享的任何特定代码。
所以应用程序会做:
import Common
import Product1
import Product2
Run Code Online (Sandbox Code Playgroud)
而 Product1 目标代码可能会这样做:
import Common
Run Code Online (Sandbox Code Playgroud)
通常流程是 Common -> Product* -> App,其中 Common 永远不会引用另一个方向。
不幸的是 Common 已经变大了,并且有很多代码可能不是每次导入都需要的。
我希望能够在 Swift 中实现的是这样的:
import Common.API
import Common.PurchaseCheckout
Run Code Online (Sandbox Code Playgroud)
我研究了模块映射,它允许设置导入子模块,但它都集中在 Objective-c 头文件上,而不是 Swift。有快速变化吗?
具体的需求是我们想创建一个轻量级的SDK,只使用部分功能,一旦我们“导入Common”,它就会使SDK膨胀,并且还增加了对很多不相关的cocoa-pods的依赖. 我们可以在 SDK 目标文件中逐个文件地包含文件,但希望模块化能让事情变得更简单。
编辑
看来我可以使用以下内容:
import class Common.FileDownloadAPI
import class Common.FileUploadAPI
Run Code Online (Sandbox Code Playgroud)
可能在我的代码中创建部分导入的印象。然而,modulemaps 似乎是objective-c 中的一种方式来为你做这件事,创建子模块。我不想编写 100 个类导入来导入子模块可能在一次导入中执行的 200 个文件中的一半。所以还在寻找思路。
我正在开发一个 Swift 动态框架,其中包含一些 Objective-C 代码。我需要使用一些遗留的 Objective-C 代码而不将代码暴露给它。我开始知道我可以使用模块映射来避免将标头添加为框架中的公共标头。我一直在使用有关如何创建模块映射的链接。我创建的模块映射看起来像这样。
framework module Xyz {
umbrella header "Xyz.h"
export *
module * { export * }
}
framework module Module1{
header "Module1.h"
}
framework module Module2{
header "Module2.h"
}
.... Rest of the modules
Run Code Online (Sandbox Code Playgroud)
之后,我尝试在 Swift 文件中导入模块,但没有自动完成。无论如何,我写了模块名称并尝试构建它。我在 Swift 文件中收到错误“无法构建 Objective-C 模块”。在模块映射文件中,我看到错误为“无法找到标头”。这是错误
所以我尝试添加构建设置的$(SRCROOT)/ProjectName/路径。Include Path之后就找不到伞头了。
我搜索了大部分 StackOverflow 和 Google,但找不到任何对我有帮助的东西。这是我第一次使用模块映射,我被困在这里,不知道该怎么做才能解决问题。如果有人能指出我错过了什么,或者您可以建议一些其他可以帮助我的来源,那就太好了。谢谢!
我正在尝试在我的Swift项目中包含一个第三方静态库。我有这两个文件,还有一些。
GoogleConversionTrackingSDK / ACTReporter.h GoogleConversionTrackingSDK / libGoogleConversionTracking.a
我将.a文件添加到目标的“链接框架和库”部分。然后module.map,我在项目中创建了一个文件,如下所示:
module GoogleConversionTracking {
header "../../Libs/GoogleConversionTrackingSDK/ACTReporter.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
在Swift文件中,我现在可以引用它:
import GoogleConversionTracking
Run Code Online (Sandbox Code Playgroud)
但是在链接时出现错误:
ld:-lGoogleConversionTracking找不到库
clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
注意:-lGoogleConversionTracking找不到库
您如何解决这个问题?我不希望使用桥接头,而是尽可能使用这些模块定义文件。
I'm trying to link statically OpenSSL library to my Swift framework, using XCode. Most approaches mentioned online are not correct, because they suggest using Import path (SWIFT_INCLUDE_PATHS). As a result, the framework binary is locked to a specific location in the file system and the binary itself is not portable. While this is not end of the world, I'd still like to be able to distribute the binary via Carthage for example and following above-mentioned approach doesn't enable …
我有一个示例 Swift Package Manager 包(我们称之为TestPackage),其结构如下:
TestPackage/
Sources/
TestPackage/
Services/
Services.h
Services.m
TestPackageUI/
UIComponent1.h
UIComponent1.m
UIComponent2.h
UIComponent2.m
include/
TestPackage.h (umbrella header)
Run Code Online (Sandbox Code Playgroud)
我的内容TestPackage.h看起来像这样:
TestPackage/
Sources/
TestPackage/
Services/
Services.h
Services.m
TestPackageUI/
UIComponent1.h
UIComponent1.m
UIComponent2.h
UIComponent2.m
include/
TestPackage.h (umbrella header)
Run Code Online (Sandbox Code Playgroud)
我想要的是这个包的用户可以将此包导入 objc/swift 并使用 Services 和 TestPackageUI。他们可以做一些事情,例如:
Objective-C:
/// Umbrella header
/// Services
#import "Services.h" // (or "Services/Services.h")
/// TestPackageUI
#import "Component1.h" // (or "TestPackageUI/Component1.h")
#import "Component2.h" // (or "TestPackageUI/Component2.h")
Run Code Online (Sandbox Code Playgroud)
迅速:
@import TestPackage;
/// or
#import <TestPackage.h>
Run Code Online (Sandbox Code Playgroud)
SPM使用文档说:
如果复杂的包含布局或与模块不兼容的标头,可以在包含目录中提供自定义 …
objective-c swift swift-package-manager module-map swift-package
module-map ×9
swift ×9
ios ×3
module ×3
objective-c ×3
xcode ×2
frameworks ×1
llvm-clang ×1
openssl ×1
target ×1
xcode9 ×1