Saya memiliki file C yang berisi fungsi my_library_function() yang telah saya kompilasi menjadi pustaka statis menggunakan gcc dan dikemas ke dalam xcframework bernama mylib.xcframework menggunakan xcodebuild -create-framework. Saya telah menambahkan kerangka kerja ini ke proyek Xcode untuk Aplikasi Mac. Namun dalam Aplikasi Mac saya, saya tidak dapat memanggil fungsi ini, dan umumnya tidak yakin tentang bagaimana melakukannya. Saya telah mencoba import mylib dari dalam file Swift dan mencoba untuk langsung memanggil fungsi my_library_function() tetapi dalam kedua kasus mendapatkan kesalahan kompilator No such module mylib dan Use of unresolved identifier 'my_library_function'. Satu-satunya solusi yang saya temukan adalah membuat bridging header dan #include file header dari jalurnya di dalam xcframework. Namun, karena pada akhirnya saya ingin bekerja dengan perpustakaan yang lebih kompleks dan kompilasi silang dan memiliki xcframework menyertakan perpustakaan statis untuk beberapa target, ini sepertinya solusi peretasan. Apakah ada cara saya bisa melakukan ini tanpa tajuk penghubung, apakah saya melewatkan sesuatu dalam proses ini?

Di bawah ini adalah instruksi yang tepat dari apa yang saya lakukan. Pertama saya mengkompilasi kode C ke perpustakaan statis. Kode sumber untuk perpustakaan berisi satu fungsi:

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

mylib.c

Saya juga memiliki tajuk untuk yang di atas:

void my_library_function(void);

mylib.h

Pohon untuk kode sumber adalah sebagai berikut:

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

Pohon sumber proyek

Saya kemudian mengkompilasi kode C ke perpustakaan statis menggunakan:

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

Kemudian saya membuat xcframework dengan:

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

Ini menghasilkan xcframework sebagai berikut:

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

pohon sumber mylib.xcframework

Saya kemudian membuat proyek Xcode baru menggunakan Xcode 11.

Di root proyek saya membuat grup baru dan menyebutnya Frameworks. Saya kemudian menyeret dan menjatuhkan xcframework ke grup kerangka XCode dan mencentang item salin jika diperlukan dan tombol radio buat grup.

Di tab umum proyek Xcode, di bawah Kerangka, Perpustakaan, dan Konten Tertanam, saya mengatur kerangka kerja ke Sematkan & Tandatangani.

Di bawah tab Build Settings, di bawah Signing, saya menyetel Other Code Signing Flags ke --deep untuk mencegah kesalahan codesign. Di tab Build Settings yang sama, di bawah Linking, Runpath Search Paths disetel ke @executable_path/../Frameworks/. Selain itu di tab Build Settings di bawah Search Paths, saya telah mencoba mengatur Framework Search Paths, Library Search Paths, dan Header Search Paths ke nilai yang sama @executable_path/../Frameworks/ dan saya juga mencoba dengan jalur ini sebagai kosong.

Sayangnya saya tidak dapat menggunakan my_library_function() dari mana saja di aplikasi, saya juga tidak dapat import mylib dari Swift.

Satu-satunya solusi yang saya temukan adalah membuat header penghubung C objektif dan membuat #include secara eksplisit menunjuk dalam folder kerangka kerja ke dalam Headers/mylib.h untuk dapat memanggil fungsi saya. Ini sepertinya solusi peretasan karena pada akhirnya saya ingin mengkompilasi silang kode saya dan akan memiliki file header terpisah untuk setiap perpustakaan terpisah untuk arsitektur yang berbeda dan mungkin akan cukup rumit untuk melakukannya dengan cara ini. Apakah ada sesuatu yang saya lewatkan tentang cara memasukkan fungsi saya dari dalam XCFramework dengan proyek MacOS Swift?

Di bawah ini adalah beberapa gambar konfigurasi Xcode saya:

Xcode Project Directory Adding Framework Embed and Sign Other code signing flags Build phases

1
Raees Rajwani 6 Juli 2020, 16:54

1 menjawab

Jawaban Terbaik

Saya membangun dengan dentang alih-alih gcc dan menyertakan file modulemap dentang di samping header. Sekarang membangun dan bahkan menawarkan pelengkapan otomatis Xcode.

0
Raees Rajwani 6 Juli 2020, 16:05