Ini adalah tindak lanjut kompilasi Dinamis Bersama Perpustakaan dengan g ++ .
Saya mencoba membuat perpustakaan kelas bersama di C ++ di Linux. Saya dapat mengkompilasi pustaka, dan saya dapat memanggil beberapa fungsi (non-kelas) menggunakan tutorial yang saya temukan di sini dan di sini . Masalah saya mulai ketika saya mencoba menggunakan kelas yang didefinisikan di perpustakaan. Tutorial kedua yang saya tautkan menunjukkan bagaimana memuat simbol untuk membuat objek dari kelas-kelas yang didefinisikan di perpustakaan, tetapi berhenti menggunakan objek-objek itu untuk menyelesaikan pekerjaan.
Adakah yang tahu tutorial yang lebih lengkap untuk membuat pustaka kelas C ++ yang dibagikan yang juga menunjukkan cara menggunakan kelas-kelas itu dalam executable terpisah? Tutorial yang sangat sederhana yang menunjukkan pembuatan objek, penggunaan (getter dan setter sederhana akan baik-baik saja), dan penghapusan akan menjadi fantastis. Tautan atau referensi ke beberapa kode sumber terbuka yang menggambarkan penggunaan perpustakaan kelas bersama akan sama baiknya.
Meskipun jawaban dari codelogic dan nimrodm melakukan pekerjaan, saya hanya ingin menambahkan bahwa saya mengambil salinan Awal Pemrograman Linux sejak menanyakan pertanyaan ini, dan bab pertama memiliki contoh kode C dan penjelasan yang baik untuk menciptakan dan menggunakan kedua statis dan shared library . Contoh-contoh ini tersedia melalui Pencarian Buku Google dalam edisi yang lebih tua dari buku itu .
sumber
Jawaban:
myclass.h
myclass.cc
class_user.cc
Pada Mac OS X, kompilasi dengan:
Di Linux, kompilasi dengan:
Jika ini untuk sistem plugin, Anda akan menggunakan MyClass sebagai kelas dasar dan mendefinisikan semua fungsi yang diperlukan secara virtual. Pengaya plugin kemudian akan berasal dari MyClass, menimpa virtual dan mengimplementasikan
create_object
dandestroy_object
. Aplikasi utama Anda tidak perlu diubah dengan cara apa pun.sumber
extern "C"
karenadlsym
fungsinya adalah fungsi C. Dan untuk memuatcreate_object
fungsi secara dinamis , ia akan menggunakan tautan gaya-C. Jika Anda tidak akan menggunakanextern "C"
, tidak akan ada cara untuk mengetahui namacreate_object
fungsi dalam file .so, karena nama-mangling dalam kompiler C ++.Berikut ini menunjukkan contoh perpustakaan kelas bersama yang dibagikan. [H, cpp] dan modul main.cpp menggunakan perpustakaan. Ini adalah contoh yang sangat sederhana dan makefile bisa dibuat lebih baik. Tetapi ini berfungsi dan dapat membantu Anda:
shared.h mendefinisikan kelas:
shared.cpp mendefinisikan fungsi getx / setx:
main.cpp menggunakan kelas,
dan makefile yang menghasilkan libshare.so dan tautan utama dengan pustaka bersama:
Untuk menjalankan 'main' yang sebenarnya dan menautkannya dengan libshare.so Anda mungkin perlu menentukan path load (atau memasukkannya ke / usr / local / lib atau yang serupa).
Berikut ini menentukan direktori saat ini sebagai jalur pencarian untuk perpustakaan dan menjalankan main (sintaks bash):
Untuk melihat bahwa program ini terhubung dengan libshare.so Anda dapat mencoba ldd:
Cetakan di mesin saya:
sumber
-L. -lshared -Wl,-rpath=$$(ORIGIN)
saat menghubungkan dan menjatuhkannyaLD_LIBRARY_PATH=.
.Pada dasarnya, Anda harus memasukkan file header kelas dalam kode di mana Anda ingin menggunakan kelas di perpustakaan bersama. Kemudian, ketika Anda menautkan, gunakan bendera '-l' untuk menautkan kode Anda dengan perpustakaan bersama. Tentu saja, ini membutuhkan .so menjadi tempat OS dapat menemukannya. Lihat 3.5. Menginstal dan Menggunakan Perpustakaan Bersama
Menggunakan dlsym adalah untuk saat Anda tidak tahu pada waktu kompilasi perpustakaan mana yang ingin Anda gunakan. Kedengarannya bukan itu masalahnya di sini. Mungkin kebingungannya adalah bahwa Windows memanggil pustaka yang dimuat secara dinamis apakah Anda melakukan penautan saat kompilasi atau saat berjalan (dengan metode analog)? Jika demikian, maka Anda dapat menganggap dlsym sebagai padanan dari LoadLibrary.
Jika Anda benar-benar perlu memuat pustaka secara dinamis (yaitu pustaka), maka FAQ ini akan membantu.
sumber
Di atas jawaban sebelumnya, saya ingin meningkatkan kesadaran tentang fakta bahwa Anda harus menggunakan idiom RAII (Resource Acquisition Is Inisialisasi) agar aman tentang penghancuran handler.
Ini adalah contoh kerja yang lengkap:
Deklarasi antarmuka
Interface.hpp
::Konten perpustakaan bersama:
Penangan perpustakaan bersama dinamis
Derived_factory.hpp
::Kode klien:
catatan:
.hpp
dan.cpp
file Anda.new
/delete
overload.Dua artikel yang jelas untuk mendapatkan detail lebih lanjut:
sumber