GNU/Linux >> Belajar Linux >  >> Linux

Kompilasi Pustaka Bersama Dinamis dengan g++

dlsym mengembalikan pointer ke simbol. (Seperti void* menjadi generik.)Dalam kasus Anda, Anda harus mentransmisikannya ke penunjuk fungsi.

 double (*mycosine)(double); // declare function pointer
 mycosine = (double (*)(double)) dlsym(handle, "cos"); // cast to function pointer and assign

 double one = mycosine(0.0); // cos(0)

Jadi ini salah satu kasus langka di mana kesalahan kompiler adalah petunjuk yang bagus.;)


C memungkinkan cast implisit dari void * ke semua jenis penunjuk (termasuk penunjuk fungsi); C++ membutuhkan casting eksplisit. Seperti yang dikatakan leiflundgren, Anda perlu memasukkan nilai pengembalian dlsym() ke jenis penunjuk fungsi yang Anda butuhkan.

Banyak orang menganggap sintaks penunjuk fungsi C canggung. Salah satu pola yang umum adalah mengetikkan penunjuk fungsi:

typedef double (*cosine_func_ptr)(double);

Anda dapat menentukan variabel pointer fungsi Anda cosine sebagai anggota tipe Anda:

cosine_func_ptr cosine;

Dan transmisikan menggunakan tipe alih-alih sintaks penunjuk fungsi yang canggung:

cosine = (cosine_func_ptr)dlsym(handle, "cos");

Linux
  1. Linux - Pemantauan Seluruh Sistem Panggilan Ke Fungsi Perpustakaan?

  2. Pengantar Pustaka Bersama Linux (Cara Membuat Pustaka Bersama)

  3. C++ Dynamic Shared Library di Linux

  1. Menautkan perpustakaan bersama dengan lib bersama lainnya di linux

  2. Menggunakan SDL2 di linux dengan g++?

  3. Dapatkan nama fungsi di pustaka bersama secara terprogram

  1. Galat Memuat Pustaka Bersama (glew)

  2. Tautan dinamis - Linux Vs. Windows

  3. Tidak dapat memuat pustaka dinamis 'libnvinfer.so.6'