my_library_function()
using を使用してスタティック ライブラリにコンパイルし、using という xcframework にパッケージ化した関数を含むgcc
Cファイルがあります。このフレームワークを Mac アプリの Xcode プロジェクトに追加しました。ただし、私の Mac アプリ内では、この関数を呼び出すことができず、一般的にその方法がわかりません。Swift ファイル内から試して、関数を直接呼び出そうとしましたが、どちらの場合もコンパイラ エラー と. 私が見つけた唯一の回避策は、ブリッジング ヘッダーを作成し、mylib.xcframework
xcodebuild -create-framework
import mylib
my_library_function()
No such module mylib
Use of unresolved identifier 'my_library_function'
#include
xcframework 内のパスからのヘッダー ファイル。ただし、最終的にはより複雑なライブラリを使用してクロス コンパイルし、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 構成のいくつかの画像です。