SwiftPM Framework не найден для библиотеки C

Я работаю над созданием оболочки Swift для существующей библиотеки C, используя Swift Package Manager. Я думаю, что все правильно структурировал, но при создании и построении проекта Xcode я получаю сообщение об ошибке. Я перепробовал все, что мог найти, но безуспешно. Официально оставив меня в тупике.

Вот ссылка на проект в его текущем состоянии: https://github.com/JKcompute/Camiitool/tree/stackpost

Вот мой Package.swift

// 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"]
        )
    ]
)

Итак, у меня есть Camiitool - это библиотека C Amiitool. Amiitool зависит от mbedtls. Итак, у меня есть цель для mbedtls, Camiitool, а затем у меня также есть цель для amiitoolSwift, для которой я планирую использовать свой быстрый API.

Вот мой быстрый файл от цели amiitoolSwift. Примечание: сейчас это очень просто, просто для тестирования.

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))
     }
}

Проблема в том, что при сборке я получаю ошибку Framework Not Found для Camiitool.

> 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: framework не найден Camiitool clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов)

Все, что я пытался исправить, похоже, создает другую версию той же ошибки. Например, модуль не найден Camiitool, или у меня был найден Camiitool, но затем я получаю ошибки при вызове метода (nfc3d_version_fork), что метод не существует.

Последнее замечание: текущее состояние моего проекта основано на найденном мной примере: https://github.com/RoaringBitmap/SwiftRoaring Это в основном то же самое, что я делаю, только без подмодуля. Я вытащил этот проект, и теперь я могу его собрать и запустить. Я сравнил все настройки между проектами и не заметил никаких различий. Что привело меня, наконец, к публикации здесь.

Запуск MacOS 10.15.7, Xcode 12.0


person Johnathon Karcz    schedule 12.10.2020    source источник


Ответы (1)


Итак, я понял это.

Сначала я заметил, что хотя файл .framework создавался, он в основном был пуст. Это явно не казалось правильным, поэтому я начал работать над отдельным проектом, чтобы убедиться, что я не пропускаю никаких шагов. Мне удалось заставить работать еще один проект, поэтому я вернулся к этому и внес некоторые изменения.

Похоже, это была проблема с моей установкой для версии 5.3. Я вернулся к 5.1 и получал ошибки для повторяющихся символов. Как только я очистил их, исключив файлы c, которые не были нужны. Я смог заставить его работать на 5.1

Чтобы вернуться к 5.1, мне нужно было удалить параметры resources.copy, которые были в моем первоначальном манифесте. Поэтому, когда я вернулся к версии 5.3, я получил несколько предупреждений о необработанных ресурсах:

warning: found 424 file(s) which are unhandled; explicitly declare them as resources or exclude from the target

Я получал это предупреждение раньше, и именно по этой причине я в первую очередь добавил resource.copy (.). На этот раз я решил применить другой подход и исключить все, что было не нужно, и посмотреть, нужно ли мне что-то специально включать после того, как я закончу. Оказывается, мне не нужно было включать какие-либо ресурсы, а исключить все мои ошибки и предупреждения были решены.

вот мой манифест обновлен.

// 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 как успешное. Хотя это было явно не так.

Затем я смог протестировать свой пакет со следующей установкой исполняемого пакета, и это тоже сработало.

// 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"]),
    ]
)
person Johnathon Karcz    schedule 15.10.2020