首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C库找不到SwiftPM框架

C库找不到SwiftPM框架
EN

Stack Overflow用户
提问于 2020-10-12 13:58:38
回答 1查看 869关注 0票数 0

我正在为现有的C库创建一个Swift包装器,使用。我认为我已经正确地构造了所有的东西,但是当我创建和构建一个Xcode项目时,我会遇到一个错误。我已经尝试了我能找到的一切,没有运气。正式的离开了我。

下面是指向处于当前状态的项目的链接:https://github.com/JKcompute/Camiitool/tree/stackpost

这是我的Package.swift

代码语言:javascript
复制
// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "CamiitoolPackage",
    products: [
        .library(name: "Camiitool", targets: ["Camiitool"]),
        .library(name: "amiitoolSwift", targets: ["amiitoolSwift"]),
    ],
    dependencies: [
    ],
    targets: [
        .target(
            name: "amiitoolSwift",
            dependencies: [ 
               "Camiitool"
            ],
            path: "./Sources/amiitoolSwift"
        ),

        .target(
            name: "Camiitool",
            dependencies: [ 
                "mbedtls"
            ],
            path: "./Sources/Camiitool",
            exclude: [
                "mbedtls",
                "LICENSE"
            ],
            resources: [
                .copy("."),
            ]
        ),
        .target(
            name: "mbedtls",
            dependencies: [],
            path: "./Sources/Camiitool/mbedtls",
            exclude: [
                "./mbedtls/yotta",
                "./mbedtls/visualc",
                "LICENSE"
            ],
            resources: [
                .copy("."),
            ]
        ),  

        .testTarget(
            name: "amiitoolSwiftTests",
            dependencies: ["amiitoolSwift"]
        )
    ]
)

所以我这里有卡米托醇是C库的Amiitool阿米托醇依赖于米贝茨。因此,我有一个mbedtls的目标,Camiitool,然后我也有一个用于amiitoolSwift的目标,我计划使用我的快速API。

这是我来自amiitoolSwift目标的快速文件。注意:这是非常基本的现在,只是为了测试。

代码语言:javascript
复制
import Foundation
import Camiitool

public class Amii {
    var someString = "test"

    public init() {
        someString = "initialized"
    }
    
    public func printTest() {
        print(someString)
    }

     public func methodJustForTesting() {
        print(someString)

        let cString: UnsafePointer<CChar> = Camiitool.nfc3d_version_fork()

       print(String(cString: cString))
     }
}

问题是,当我构建的时候,我得到了一个没有找到Camiitool的框架错误。

代码语言:javascript
复制
> Ld /Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Products/Debug/amiitoolSwift.framework/Versions/A/amiitoolSwift normal (in target 'amiitoolSwift' from project 'CamiitoolPackage')
cd /Users/ME/GIT/PERSONAL/Amiibo/backup-wip/Camiitool
/Applications/Xcode_12.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -target x86_64-apple-macos10.10 -dynamiclib -isysroot /Applications/Xcode_12.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -L/Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Products/Debug -F/Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Products/Debug -F/Applications/Xcode_12.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -filelist /Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Intermediates.noindex/CamiitoolPackage.build/Debug/amiitoolSwift.build/Objects-normal/x86_64/amiitoolSwift.LinkFileList -install_name @rpath/amiitoolSwift.framework/Versions/A/amiitoolSwift -Xlinker -rpath -Xlinker /usr/lib/swift -Xlinker -rpath -Xlinker /Applications/Xcode_12.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -Xlinker -object_path_lto -Xlinker /Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Intermediates.noindex/CamiitoolPackage.build/Debug/amiitoolSwift.build/Objects-normal/x86_64/amiitoolSwift_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -fobjc-link-runtime -L/Applications/Xcode_12.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -L/usr/lib/swift -Xlinker -add_ast_path -Xlinker /Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Intermediates.noindex/CamiitoolPackage.build/Debug/amiitoolSwift.build/Objects-normal/x86_64/amiitoolSwift.swiftmodule -framework Camiitool -framework mbedtls -Xlinker -dependency_info -Xlinker /Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Intermediates.noindex/CamiitoolPackage.build/Debug/amiitoolSwift.build/Objects-normal/x86_64/amiitoolSwift_dependency_info.dat -o /Users/ME/Library/Developer/Xcode/DerivedData/CamiitoolPackage-fjhqfruljmetilfuiykpzwhzobkc/Build/Products/Debug/amiitoolSwift.framework/Versions/A/amiitoolSwift

ld:框架未找到Camiitool clang: error:链接器命令失败,退出代码1(使用-v查看调用)

我试图解决的任何问题似乎都会造成相同错误的不同版本。例如,"Module“,或者我已经找到Camiitool,但是我得到了方法调用(nfc3d_version_fork)上的错误,即该方法不存在。

最后一个注意:我的项目的当前状态是基于我发现的这个例子:https://github.com/RoaringBitmap/SwiftRoaring,这基本上是我正在做的事情,除了没有子模块。我已经拉了这个项目,我能够建立和运行它只是很好。我已经比较了项目之间的所有设置,我没有注意到任何不同。这让我终于在这里发帖了。

运行MacOS 10.15.7,Xcode 12.0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-15 15:38:07

所以我想出了这个办法。

首先,我注意到尽管正在生成.framework文件,但它基本上是空的。这显然是不正确的,所以我开始了一个单独的项目,以确保我没有错过任何步骤。我能够得到另一个项目的工作,所以我回到了这个项目,并做了一些改变。

看起来这是我为5.3版安装的一个问题。我回到5.1,并得到错误的重复符号。有一次,我通过排除不需要的c文件清除了这些文件。我能让它在5.1上工作

为了回到5.1,我需要删除原始清单中的resources.copy参数。因此,当我回到5.3时,我收到了一堆关于未处理资源的警告:

代码语言:javascript
复制
warning: found 424 file(s) which are unhandled; explicitly declare them as resources or exclude from the target

我之前收到了这个警告,这就是我添加resource.copy(“”)的原因。首先。这次我决定采取一种不同的方法,排除所有不需要的东西,看看是否需要在我做完之后具体地包括任何东西。结果,我不需要包括任何资源,并排除了我所有的错误和警告。

这是我的最新名单。

代码语言:javascript
复制
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "CamiitoolPackage",
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(name: "Camiitool", targets: ["Camiitool"]),
        .library(name: "amiitoolSwift", targets: ["amiitoolSwift"]),
        .library(name: "amiitoolSwiftDynamic", type: .dynamic,  targets: ["amiitoolSwift"]),
    ],
    dependencies: [
    ],
    targets: [
        .target(
            name: "amiitoolSwift",
            dependencies: [ 
               "Camiitool"
            ],
            path: "./Sources/amiitoolSwift"
        ),
        .target(
            name: "Camiitool",
            dependencies: [ 
                "mbedtls"
            ],
            path: "./Sources/Camiitool",
            exclude: [
                "./mbedtls",
                "./mbedtls/yotta",
                "./mbedtls/visualc",
                "./LICENSE",
                "./amiitool.c",
                "./README.md",
                "./Makefile"
            ]
        ),
        .target(
            name: "mbedtls",
            dependencies: [],
            path: "./Sources/Camiitool/mbedtls",
            exclude: [
                "./yotta",
                "./visualc",
                "./LICENSE",
                "./programs",
                "./tests",
                "./scripts",
                "./include/CMakeLists.txt",
                "./DartConfiguration.tcl",
                "./doxygen",
                "./library/Makefile",
                "./apache-2.0.txt",
                "./Makefile",
                "./README.md",
                "./ChangeLog",
                "./CMakeLists.txt",
                "./circle.yml",
                "./configs/README.txt",
                "./library/CMakeLists.txt"
            ]
        ),  
        .testTarget(
            name: "amiitoolSwiftTests",
            dependencies: ["amiitoolSwift"]
        )
    ]
)

现在它构建,不生成警告或错误,并且我的.framework文件已经完成,就像预期的那样。我认为这里可能有一个错误,我没有得到一个更好的错误,因为xcode将显示我的Camiitool.framework构建成功。尽管很明显不是。

然后,我能够用下面的可执行包设置来测试我的包,这也是有效的。

代码语言:javascript
复制
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "packageTester",

    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(name: "CamiitoolPackage", path: "../Camiitool"),
    ],
    targets: [
        .target(
            name: "packageTester",
            dependencies: [
                .product(name: "amiitoolSwift", package: "CamiitoolPackage")
            ]
        ),
        .testTarget(
            name: "packageTesterTests",
            dependencies: ["packageTester"]),
    ]
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64319353

复制
相关文章

相似问题

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