2

my_library_function()using を使用してスタティック ライブラリにコンパイルし、using という xcframework にパッケージ化した関数を含むgccCファイルがあります。このフレームワークを Mac アプリの Xcode プロジェクトに追加しました。ただし、私の Mac アプリ内では、この関数を呼び出すことができず、一般的にその方法がわかりません。Swift ファイル内から試して、関数を直接呼び出そうとしましたが、どちらの場合もコンパイラ エラー と. 私が見つけた唯一の回避策は、ブリッジング ヘッダーを作成し、mylib.xcframeworkxcodebuild -create-frameworkimport mylibmy_library_function()No such module mylibUse of unresolved identifier 'my_library_function'#includexcframework 内のパスからのヘッダー ファイル。ただし、最終的にはより複雑なライブラリを使用してクロス コンパイルし、xcframework に複数のターゲット用の静的ライブラリを含めるようにしたいので、これはハックな回避策のように思えます。ブリッジヘッダーなしでこれを行う方法はありますか?このプロセスで何か不足していますか?

以下は、私が行ったことの正確な指示です。まず、C コードをスタティック ライブラリにコンパイルしました。ライブラリのソース コードには、1 つの関数が含まれています。

#include <stdio.h>
void my_library_function(void) {
  printf("called from a static library");
}

mylib.c

上記のヘッダーもあります。

void my_library_function(void);

mylib.h

ソースコードのツリーは次のとおりです。

.
├── include
│   └── mylib.h
└── mylib.c

プロジェクト ソース ツリー

次に、以下を使用して C コードをスタティック ライブラリにコンパイルしました。

> gcc -c mylib.c -o mylib.o
> ar rcs mylib.a mylib.o

次に、以下を使用して xcframework を作成しました。

xcodebuild -create-xcframework -library mylib.a -headers include -output mylib.xcframework

これにより、xcframework が次のようになりました。

.
├── Info.plist
└── macos-x86_64
    ├── Headers
    │   └── mylib.h
    └── mylib.a

mylib.xcframework ソース ツリー

次に、Xcode 11 を使用して新しい Xcode プロジェクトを作成しました。

プロジェクトのルートで新しいグループを作成し、それを Frameworks と呼びました。次に、xcframework を XCode フレームワーク グループにドラッグ アンド ドロップし、[必要に応じてアイテムをコピー] チェックボックスと [グループの作成] ラジオ ボタンをオンにしました。

Xcode プロジェクトの一般タブの [フレームワーク、ライブラリ、および埋め込みコンテンツ] で、フレームワークを [埋め込みと署名] に設定します。

[Build Settings] タブの [Signing] で、[Other Code Signing Flags] を に設定して、コード署名--deepエラーを防止しました。同じ Build Settings タブの Linking で、Runpath Search Paths が に設定されてい@executable_path/../Frameworks/ます。さらに、[検索パス] の下の [ビルド設定] タブで、フレームワーク検索パス、ライブラリ検索パス、ヘッダー検索パスを同じ値に設定@executable_path/../Frameworks/しようとしましたが、これらのパスも空にしてみました。

残念ながらmy_library_function()、アプリケーションのどこからでもを使用することはできません。またimport mylib、Swift からも使用できません。

私が見つけた唯一の回避策は、目的の C ブリッジ ヘッダーを作成し#include、フレームワーク フォルダー内で明示的にポイントしてHeaders/mylib.h、関数を呼び出せるようにすることです。これはハックなソリューションのように思えますが、最終的にはコードをクロス コンパイルしたいと考えており、異なるアーキテクチャの個別のライブラリごとに個別のヘッダー ファイルが必要になるため、この方法で行うのは非常に複雑になる可能性があります。MacOS Swift プロジェクトを使用して XCFramework 内から関数を含める方法について、私が見逃しているものはありますか?

以下は、私の Xcode 構成のいくつかの画像です。

Xcode プロジェクト ディレクトリ フレームワークの追加 埋め込みと署名 その他のコード署名フラグ ビルド フェーズ

4

1 に答える 1