Ada pertanyaan bagus tentang perbedaan antara kedua opsi tersebut seperti yang dijelaskan di Link Binary with libraries VS Embed Frameworks .
Sepertinya kita memiliki opsi untuk menggunakan keduanya, hanya ingin tahu kasus mana yang sebaiknya kita gunakan binari tertanam lebih baik, atau daripada kerangka kerja tertaut?
Adakah contoh yang solid untuk mengatasi hal ini dengan lebih jelas? Terima kasih
ios
xcode
frameworks
embedded-binary
Forrest
sumber
sumber
Jawaban:
Pertanyaan yang Anda tautkan merujuk pada fungsi "Link Binary With Libraries", yang agak berbeda dari biner yang disematkan.
"Link Binary With Libraries" berarti apa yang Anda harapkan sehubungan dengan linkage: Terlepas dari apakah biner tersebut adalah library statis, library dinamis, atau framework, biner tersebut akan ditautkan ke kode objek Anda pada waktu link setelah kompilasi.
Ketika Anda memikirkan keterkaitan dengan pustaka statis, yang terjadi cukup jelas: penaut menyalin kode dari pustaka (misalnya
libFoo.a
) ke dalam biner keluaran Anda. File keluaran Anda bertambah besar tetapi tidak perlu menyelesaikan dependensi eksternal apa pun pada waktu proses. Semua yang dibutuhkan program Anda untuk dijalankan (sehubungan dengan pustaka statis) ada setelah program dibuat.Dengan pustaka dinamis (.dylib, atau kerangka kerja yang dipasok sistem), diharapkan pustaka yang Anda tautkan akan ada di suatu tempat di jalur pemuat pustaka dinamis sistem saat Anda menjalankan program. Dengan cara ini Anda tidak memiliki overhead untuk menyalin semua pustaka eksternal pihak ketiga ke biner Anda, dan semua program berbeda di komputer yang juga ditautkan ke pustaka itu akan dapat menemukannya, yang menghemat ruang disk minimal, tetapi juga kemungkinan ruang memori, tergantung pada bagaimana dan di mana perpustakaan cache sistem.
Framework mirip dengan library dinamis, tetapi dapat berisi resource dalam struktur direktorinya (gambar, audio, framework lain, dll.). Dalam hal ini statis-perpustakaan atau .dylib file sederhana tidak akan dipotong sehingga Anda mungkin harus link ke sebuah kerangka kerja hanya begitu itu dapat menemukan apa yang dibutuhkan untuk berjalan dengan baik.
Saat Anda menautkan ke kerangka pihak ketiga (katakanlah sesuatu yang Anda unduh dari github dan buat sendiri), kerangka itu mungkin tidak ada di sistem yang ingin Anda jalankan. Dalam kasus ini, Anda tidak hanya akan menautkan ke kerangka kerja, tetapi juga menyematkannya di dalam bundel aplikasi Anda menggunakan fase "Salin Kerangka Kerja". Saat program Anda berjalan, runtime-linker (alias resolver) akan melihat ke dalam bundel Anda selain ke jalur pemuat sistem, menemukan kerangka kerja yang disematkan, dan menautkannya sehingga aplikasi Anda akan memiliki kode yang diperlukan untuk menjalankannya.
Terakhir, apa yang disebut sebagai "biner tertanam" adalah file yang dapat dieksekusi yang Anda berdua sematkan dalam bundel aplikasi Anda melalui Fase File Salin, dan yang Anda jalankan sendiri, mungkin dengan panggilan ke
popen()
atau serupa. Biner yang disematkan dapat dipanggil oleh program Anda, tetapi tidak terkait dengannya. Ini adalah entitas yang sepenuhnya eksternal (seperti program di/bin
direktori).Dalam praktiknya, untuk pustaka dan kerangka kerja yang disediakan sistem Anda akan menautkannya dan hanya itu yang perlu Anda lakukan.
Jika Anda perlu menautkan pustaka yang Anda buat yang tidak memerlukan sumber daya yang disematkan (yaitu, tidak memerlukan kerangka kerja), Anda dapat menautkan ke pustaka statis. Jika Anda menemukan Anda memiliki beberapa modul dalam program Anda yang ingin menggunakan kode perpustakaan yang sama, maka mengubahnya menjadi kerangka kerja atau perpustakaan dinamis dan menautkannya dapat menghemat ruang dan mungkin nyaman (terutama jika penggunaan memori menjadi perhatian).
Terakhir, kerangka kerja tidak hanya dapat menyertakan sumber daya, tetapi file header dan / atau lisensi. Menggunakan kerangka kerja untuk menyampaikan file-file ini sebenarnya adalah mekanisme distribusi yang mudah sehingga sering kali Anda mungkin ingin memasukkan kerangka kerja agar hal-hal ini dapat mengikuti biner Anda (yaitu persyaratan lisensi mungkin membuat ini wajib).
--- EDIT ---
Adam Johns memposting pertanyaan berikut sebagai komentar:
Saya mengatakan biner yang disematkan hanyalah file sumber daya lain dalam bundel Anda, seperti file audio atau gambar, meskipun file tersebut adalah alat baris perintah yang dapat dieksekusi. The
popen()
function (man popen
dari terminal Anda untuk membaca lebih lanjut tentang hal itu) memungkinkan Anda menjalankan program yang sewenang-wenang dari program lain berjalan. Thesystem()
Fungsi adalah cara lain. Ada yang lain, dan saya akan memberikan contoh historis di sini yang mungkin membuat pemahaman tentang penggunaan biner tersemat menjadi sedikit lebih jelas:Seperti yang mungkin Anda sadari, saat Anda meluncurkan aplikasi di Mac OS X, aplikasi diluncurkan dengan id pengguna dari pengguna saat ini. Di bawah penginstalan yang paling umum, itulah pengguna default di pengguna Desktop
admin
, yang diberi id pengguna501
.Pada sistem operasi berbasis Unix hanya
root
pengguna (id pengguna0
) yang memiliki akses penuh ke seluruh sistem file. Terkadang program penginstal yang diluncurkan oleh pengguna Desktop perlu menginstal file di direktori yang memiliki hak istimewa (misalnya driver). Dalam hal ini, program aplikasi perlu meningkatkan hak istimewanya kepadaroot
pengguna sehingga dapat menulis di direktori yang dibatasi ini.Untuk memfasilitasi hal ini dalam sistem operasi melalui OS X 10.7, Apple menyediakan fungsi AuthorizationExecuteWithPrivileges () dalam API Layanan Otorisasi (ini sekarang sudah usang, tetapi masih menjadi contoh yang berguna).
AuthorizationExecuteWithPrivileges()
mengambil argumen jalur ke alat baris perintah untuk dieksekusi sebagairoot
. Alat baris perintah adalah skrip shell yang dapat dieksekusi atau biner terkompilasi yang Anda tulis untuk menjalankan logika penginstalan. Alat ini dipasang di dalam bundel aplikasi Anda seperti file sumber daya lainnya.Saat dipanggil, OS memasang dialog otorisasi yang meminta kata sandi pengguna (Anda pernah melihat ini sebelumnya!) Dan ketika dimasukkan akan menjalankan program seperti
root
atas nama aplikasi Anda. Proses ini mirip dengan hanya menjalankan program denganpopen()
diri Anda sendiri, meskipunpopen()
tidak memberi Anda keuntungan dari peningkatan hak istimewa.sumber
link
, tetapi Anda benar bahwa Anda juga harus menyematkannya melalui fase salin-file (jika tidak, bagaimana Anda akan menggunakannya?). Tujuan menggunakan kerangka pihak ketiga atau biner tersemat adalah untuk mengeksekusi kode yang disediakan entitas. Dengan biner tertanam, tidak ada tautan yang terlibat. Saat runtime, Anda membuat jalur ke biner lalu menjalankannya secara manual. Dengan kerangka kerja, penghubung waktu kompilasi akan menautkannya saat Anda membangun aplikasi, kemudian (jika kerangka kerja pihak ketiga) Anda menyematkannya melalui fase salin-file, dan terakhir penghubung waktu proses menautkannya lagi saat Anda menjalankan aplikasi. .Pendeknya,
Mengapa?
sumber
Ini adalah bagian dari
Dependency
manajemen [Tentang]Harap dicatat bahwa
Xcode 11
hanya berisiFrameworks, Libraries, and Embedded Content
bagian diGeneral
tab[Xcode v11]
Tautkan Biner
General -> Linked Frameworks and Libraries
adalah cermin dariBuild Phases -> Link Binary With Libraries
.Perpustakaan dan Kerangka Statis
Jika Anda menambahkan a
Static Library or Static Framework
ke bagian ini, itu akan muncul diFrameworks
grup [About] (Project Navigator -> <workspace/project> -> Frameworks
) dan akan ada referensi yang ditambahkan ke proyek Anda untuk itu. Kemudian akan digunakan olehStatic Linker
.Static Linker
pada waktu kompilasi akan menyertakan / menyalin semua kode dari perpustakaan ke dalam file objek yang dapat dieksekusi.Static linker
bekerja berpasangan denganBuild Settings -> <Library/Framework> Search Paths
Static Library
Build Settings -> Library Search Paths
[perpustakaan tidak ditemukan] Jika Anda tidak menambahkan astatic library
ke bagian ini, Anda akan mendapatkan kesalahan penaut [ld: simbol tidak ditemukan]Static Framework
Build Settings -> Framework Search Paths
. Jika Anda tidak menambahkan astatic framework
ke bagian ini, Anda akan mendapatkan kesalahan kompilasi [Tidak ada modul seperti itu]Sematkan biner
Perpustakaan Statis dan Kerangka Statis
Penyematan tidak akan masuk akal untuk
Static Library
danStatic Framework
karena simbol darinya dikompilasi ke dalam biner yang dapat dieksekusi. Xcode tidak akan membiarkan Anda meletakkan distatic library
bawah bagian Sematkan.Kerangka Dinamis
General -> Embedded Binaries
adalah cermin dariBuild Phases -> Embed Frameworks
.Menyematkan sebenarnya menambahkan salinan kerangka kerja ke dalam bundel aplikasi Anda.
Secara default folder bundel adalah
Frameworks
tetapi Anda dapat mengubahnya menggunakanDestination
field. Selain itu, Anda dapat menentukan fileSubpath
.Dynamic linker :dyld
pada saat memuat atau menjalankan akan mencoba menemukan kerangka tertanam menggunakan@rpath
[About] Jika tidak ditemukan kesalahan akan terjadi [dyld: Library tidak dimuat]Hasil:
Static Library
-Link
Static Framework
-Link
Dynamic Framework
-Embed
[Saat menggunakan Tautan dan Sematkan]
[Kosa kata]
sumber