Jika Anda kurang beruntung dan pindah dari Linux ke Windows, Anda mungkin membuang waktu untuk mencari tahu mengapa DLL Anda tidak berfungsi, sampai Anda menemukan bahwa Anda harus menambahkan __declspec(dllexport)sebelum setiap fungsi di perpustakaan Anda
SomethingSomething
Jawaban:
74
Ini adalah ekstensi spesifik Microsoft untuk bahasa C ++ yang memungkinkan Anda untuk menghubungkan tipe atau fungsi dengan informasi kelas penyimpanan.
Terima kasih - tetapi untuk apa saya menggunakannya?
Scott J
4
Untuk mendeklarasikan antarmuka dan kelas COM, misalnya, Anda menggunakan __declspec (uuid), untuk mengekspor fungsi sans file DEF yang Anda gunakan __declspec (dllexport), dll. Daftar lengkapnya cukup panjang.
Seva Alekseyev
1
@ScottJ Saya selalu menggunakannya untuk properti: __declspec (properti (get = X put = X)) pengidentifikasi tipe data. MSDN tentu saja memiliki lebih banyak perincian. Sebagai "C # to C / C ++ programmer" itu adalah kebahagiaan!
MasterMastic
51
Contoh kanonik adalah __declspec(dllimport)dan __declspec(dllexport), yang menginstruksikan penghubung untuk mengimpor dan mengekspor (masing-masing) simbol dari atau ke DLL.
// header
__declspec(dllimport)void foo();// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)hanya membungkus hal-hal spesifik Microsoft - untuk mencapai kompatibilitas, orang biasanya akan membungkusnya dengan makro)
@tetris, Anda tidak tahu dari kode. Keputusan dibuat oleh tautan, yang akan memilih yang pertama .libditemukannya yang memiliki simbol ekspor yang cocok.
Euro Micelli
19
Itu sebagian besar digunakan untuk mengimpor simbol dari / mengekspor simbol ke shared library (DLL). Baik dukungan kompiler Visual C ++ dan GCC __declspec(dllimport)dan __declspec(dllexport). Penggunaan lain (hanya Microsoft) didokumentasikan dalam MSDN .
Contoh lain untuk menggambarkan kata kunci __declspec :
Ketika Anda menulis Driver Kernel Windows, kadang-kadang Anda ingin menulis sendiri urutan prolog / epilog Anda menggunakan kode assembler inline , sehingga Anda dapat mendeklarasikan fungsi Anda dengan atribut telanjang .
Pada dasarnya, ini adalah cara Microsoft memperkenalkan ekstensi C ++ sehingga tidak akan bertentangan dengan ekstensi standar C ++ di masa mendatang. Dengan __declspec, Anda dapat mengaitkan fungsi atau kelas; arti tepatnya bervariasi tergantung pada sifat __declspec. __declspec (telanjang), misalnya, menekan generasi prolog / epilog (untuk penangan interrupt, kode yang dapat disematkan, dll), __declspec (utas) membuat variabel thread-lokal, dan sebagainya.
Daftar lengkap atribut __declspec tersedia di MSDN, dan bervariasi menurut versi dan platform kompiler.
Mengingat kompiler non-microsoft seperti GCC 4.2, yang menawarkan alternatif selain mereka __attribute__ ((dllexport))untuk __declspec(dllexport), apakah adil untuk panggilan __declspec, Microsoft hanya ekstensi?
user2338150
0
Saya tahu sudah delapan tahun tetapi saya ingin membagikan potongan kode yang ditemukan di MRuby ini yang menunjukkan bagaimana __declspec()lebah dapat digunakan pada tingkat yang sama dengan export keyword.
/** Declare a public MRuby API function. */#if defined(MRB_BUILD_AS_DLL)#if defined(MRB_CORE) || defined(MRB_LIB)# define MRB_API __declspec(dllexport)#else# define MRB_API __declspec(dllimport)#endif#else# define MRB_API extern#endif
__declspec(dllexport)
sebelum setiap fungsi di perpustakaan AndaJawaban:
Ini adalah ekstensi spesifik Microsoft untuk bahasa C ++ yang memungkinkan Anda untuk menghubungkan tipe atau fungsi dengan informasi kelas penyimpanan.
Dokumentasi
__declspec (C ++)
sumber
Contoh kanonik adalah
__declspec(dllimport)
dan__declspec(dllexport)
, yang menginstruksikan penghubung untuk mengimpor dan mengekspor (masing-masing) simbol dari atau ke DLL.(
__declspec(..)
hanya membungkus hal-hal spesifik Microsoft - untuk mencapai kompatibilitas, orang biasanya akan membungkusnya dengan makro)sumber
.lib
ditemukannya yang memiliki simbol ekspor yang cocok.Itu sebagian besar digunakan untuk mengimpor simbol dari / mengekspor simbol ke shared library (DLL). Baik dukungan kompiler Visual C ++ dan GCC
__declspec(dllimport)
dan__declspec(dllexport)
. Penggunaan lain (hanya Microsoft) didokumentasikan dalam MSDN .sumber
Contoh lain untuk menggambarkan kata kunci __declspec :
Ketika Anda menulis Driver Kernel Windows, kadang-kadang Anda ingin menulis sendiri urutan prolog / epilog Anda menggunakan kode assembler inline , sehingga Anda dapat mendeklarasikan fungsi Anda dengan atribut telanjang .
Atau
Silakan merujuk ke telanjang (C ++)
sumber
Pada dasarnya, ini adalah cara Microsoft memperkenalkan ekstensi C ++ sehingga tidak akan bertentangan dengan ekstensi standar C ++ di masa mendatang. Dengan __declspec, Anda dapat mengaitkan fungsi atau kelas; arti tepatnya bervariasi tergantung pada sifat __declspec. __declspec (telanjang), misalnya, menekan generasi prolog / epilog (untuk penangan interrupt, kode yang dapat disematkan, dll), __declspec (utas) membuat variabel thread-lokal, dan sebagainya.
Daftar lengkap atribut __declspec tersedia di MSDN, dan bervariasi menurut versi dan platform kompiler.
sumber
GCC 4.2
, yang menawarkan alternatif selain mereka__attribute__ ((dllexport))
untuk__declspec(dllexport)
, apakah adil untuk panggilan__declspec
, Microsoft hanya ekstensi?Saya tahu sudah delapan tahun tetapi saya ingin membagikan potongan kode yang ditemukan di MRuby ini yang menunjukkan bagaimana
__declspec()
lebah dapat digunakan pada tingkat yang sama denganexport keyword
.sumber