| 
                         我正在Linux上编写一些入门级的swift代码作为学习练习. 
作为一般任务,我希望在我自己的代码中使用第三方Swift模块.我们称这个模块为“Foo”. Foo模块有一个Package.swift文件,在该目录中运行swift build之后,它创建了.build / debug / libFoo.so. 
现在我想做两件事: 
>能够在REPL中导入Foo. >能够在我自己的swift程序中导入Foo,可能是通过链接这个共享对象. 
我觉得这两个任务都是相关的,所以现在它们都是同一个问题. 
对于1.,我不明白包裹如何被REPL“找到”.我尝试了swift -F .build / debug -framework Foo,但我得到了“没有这样的模块”错误.我也尝试了swift -I .build / debug,结果相同. 
对于2.,我检查了swiftc –help并且有-L和-l选项但是我无法找到正确的方法来使用它们: 
$swiftc main.swift -L ../foo.git/.build/debug -llibFoo.so
main.swift:1:8: error: no such module 'Foo'
import Foo
       ^
 
我正在使用/ Swift 2.2或3.0(使用游泳而不是快速构建2.2,因为没有快速构建 – 但它产生相同的输出我相信). 
请注意,我了解swift build可以自动下载和构建第三方模块,但是我想知道如何合并磁盘模块,因为它们可能是我自己的工作进度模块. 
编辑:我尝试了一个基于发现的swift3的小实验,你可以使用本地路径作为Package的依赖关系:列表中的url:参数,至少对于本地开发. 
我创建了一个目录Bar和Bar / Package.swift: 
import PackageDescription
let package = Package(name: "Bar")
 
我还创建了Bar / Sources / bar.swift,其中包含: 
public func bar(arg: Int) -> Int {
    return arg * 2
}
 
目的是模块Bar提供名为bar(arg :)的函数. 
我做了一个git init,git add.,git commit -m“初始提交.”然后git tag 1.0.0为这个模块创建一个标记的本地git repo. 
然后回到顶层,我创建了目录Foo和Foo / Package.swift: 
import PackageDescription
let package = Package(
    name: "Foo",dependencies: [ .Package(url: "../Bar",majorVersion: 1) ]
)
 
请注意../Bar的相对路径. 
我还创建了Foo / Sources / main.swift: 
import Bar
print(bar(arg: 11))
 
现在,当我快速构建Foo内部时,它克隆Bar并构建它.然而,我得到以下错误;没有这样的模块: 
$swift build
Compile Swift Module 'Bar' (1 sources)
Compile Swift Module 'Foo' (1 sources)
.../Foo/Sources/main.swift:1:8: error: no such module 'Bar'
import Bar
       ^
 
奇怪的是,如果我再次执行完全相同的构建命令,我会得到一个不同的错误: 
$swift build
Compile Swift Module 'Foo' (1 sources)
Linking .build/debug/Bar
.../Foo/Sources/main.swift:3:7: error: use of unresolved identifier 'bar'
print(bar(arg: 11))
      ^~~
 
我曾希望这可行.
最佳答案
 
Be able to import Foo in my own swift program,perhaps by linking with this shared object. 
 
使用您在“编辑”之后在问题中发布的示例,如果您使用快速构建,这似乎可以正常工作. Swift Package Manager将为您处理所有依赖项,即使它们是在磁盘上(这适用于Swift 3和4): 
$cd Foo
$swift build
Cloning /path/to/Bar
HEAD is now at 0c3fd6e Initial commit.
Resolved version: 1.0.0
Compile Swift Module 'Bar' (1 sources)
Compile Swift Module 'Foo' (1 sources)
Linking ./.build/debug/Foo
$.build/debug/Foo
22
 
请注意,Foo / .build / debug不包含任何.so文件: 
$ls Foo/.build/debug
Bar.build  Bar.swiftdoc  Bar.swiftmodule  Foo  Foo.build  Foo.swiftdoc  Foo.swiftmodule  ModuleCache
 
我相信使用.swiftdoc和.swiftmodule文件. 
Be able to import Foo in the REPL. 
 
这部分有点麻烦,但我找到了解决方案here.要将它应用到您的示例中,您有两个选择: 
> Use swift build with extra flags(适用于Swift 3和4): 
$cd Bar
$swift build -Xswiftc -emit-library
Compile Swift Module 'Bar' (1 sources)
$swift -I .build/debug -L . -lBar
  1> import Bar
  2> bar(arg: 11) 
$R0: Int = 22
  3> 
 
这将在当前目录中创建libBar.so: 
$ls
libBar.so  Package.swift  Sources
 
> Update your Package.manifest(这是特定于Swift 4): 
>更新的Package.manifest看起来像这样: 
// swift-tools-version:4.0
import PackageDescription
let package = Package(
    name: "Bar",products: [
        .library(
            name: "Bar",type: .dynamic,targets: ["Bar"]),],targets: [
        .target(
            name: "Bar",dependencies: [],path: "Sources"),]
)
 
>这就是你如何构建并调用REPL: 
$cd Bar
$swift build
Compile Swift Module 'Bar' (1 sources)
Linking ./.build/x86_64-unknown-linux/debug/libBar.so
$swift -I .build/debug -L .build/debug -lBar
  1> import Bar 
  2> bar(arg: 11) 
$R0: Int = 22
  3>  
 
这将在.build / debug目录中创建libBar.so: 
$ls .build/debug
Bar.build  Bar.swiftdoc  Bar.swiftmodule  libBar.so  ModuleCache
 
如果您无法重现这些结果,我建议清理所有.build目录和.so文件,并安装一个干净版本的Swift(我推荐swiftenv).                         (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |