__declspec (dllimport) gerçekten ne anlama geliyor?


Yanıtlar:


118

__declspecMicrosoft'a özgü, depolama sınıfı bilgileri belirlemenize olanak tanıyan bir özniteliktir.
(Nitpicker Köşesi: Bununla birlikte, bir dizi başka derleyici satıcısı - örneğin GCC - Microsoft'un derleyicileri hedef alarak yazılan kurulu kod tabanı ile uyumluluk için artık bu dil uzantısını desteklemektedir. Hatta bazıları ek depolama sınıfı öznitelikleri sağlar.)

Belirtilebilen depolama sınıfı özniteliklerinden ikisi dllimportve dllexport. Bunlar, derleyiciye bir işlevin veya nesnenin bir DLL'den (sırasıyla) içe veya dışa aktarıldığını gösterir.

Daha spesifik olarak, bir modül tanımı ( .DEF) dosyası gerektirmeden DLL'nin istemciye arayüzünü tanımlarlar . Çoğu kişi, bu dil uzantılarını kullanmayı DEF dosyaları oluşturmaktan çok daha kolay bulur.

Bariz nedenlerden dolayı __declspec(dllimport)ve __declspec(dllexport)genellikle birbiriyle eşleştirilir. Sen kullanmak dllexportbir DLL dosyasından verilen bir sembol olarak işaretlemek için ve kullandığınız dllimportbaşka dosyada olduğu ihraç sembol almak için.

Bu nedenle ve aynı başlık dosyası genellikle hem DLL'yi derlerken hem de DLL'nin arabirimini kullanan istemci kodunda kullanıldığından, derleme zamanında uygun öznitelik belirticisine otomatik olarak çözümlenen bir makro tanımlamak yaygın bir modeldir. Örneğin:

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

Ve sonra dışa aktarılması gereken tüm sembolleri işaretleyin DLLEXPORT.

Muhtemelen, Q_CORE_EXPORTmakronun yaptığı şey budur, ya Q_DECL_IMPORTda Q_DECL_EXPORT.


__declspec düzgün bir şekilde "MS'ye özgü" değildir (çok daha fazla "derleyiciye özeldir) ve bazı derleyiciler bu bildirimi birden çok platform için de kullanır. Öznitelik değerlerinden bazıları (dllexport / dllimports MS'e özgüdür, çünkü DLL MS'dir
Sözlük

9
@Emilio: Bildiğim kadarıyla Microsoft, __declspecgösterimi C ++ dilinin bir uzantısı olarak icat etti . Artık GCC'nin bunu desteklediğine inanıyorum, ancak bu öncelikle Microsoft'un derleyicileriyle uyumluluk nedenleriyle. Ve "MS'ye özgü" nin "derleyiciye özgü" den ne kadar farklı olduğunu anlamıyorum. Microsoft bir C ++ derleyici yazdı ve birçok kişi bunu kullanıyor. Visual Studio ile birlikte gelir.
Cody Grey

8
Microsoft bir derleyici yapar. Adı "Microsoft C / C ++ Optimizing Compiler", cl.exe'dir. Birçok kişi yanlışlıkla Visual Studio'ya bir derleyici gibi başvurur, ancak bu bir IDE'dir. İnsanların neden "Microsoft'a özgü" ne anlama geldiği konusunda yeterince titiz olduklarını bilmiyorum. "MS ortamı" anlamına gelmez (her ne ise) ve kesinlikle "Windows" anlamına gelmez. Evet, diğer derleyici satıcıları artık Microsoft derleyicilerini hedef alan yüklü kod tabanıyla uyumluluk için uzantıyı destekliyor. Daha önce de söylediğim gibi, bildiğim kadarıyla Microsoft sözdizimini icat etti. Burada yapılan nokta budur.
Cody Grey

2
@CodyGray: Microsoft'un bunu tek başına icat etmesi yeterli olmazdı. Bununla birlikte, Microsoft onu icat etmiş, hiçbir standart içermiyor, diğerleri sadece uyumluluk için uyguluyor ve esas olarak Microsoft Windows'u hedefleyen programlar için kullanılıyor (münhasıran değilse), onu "Microsoft'a özgü" olarak adlandırmak için çok güçlü bir noktaya işaret ediyor
celtschk

6
Bu harika bir cevap, özellikle de "çünkü aynı başlık dosyası genellikle hem DLL hem de istemci kodunda kullanılır"! İthalat / ihracat malzemelerinin her yönünü kristal netliğinde yapar.
Ela782

30

__declspec(dllimport) derleyiciye bir işlevin veya nesnenin veya veri türünün harici bir DLL'de tanımlandığını söyleyen bir depolama sınıfı belirticidir.

İşlev veya nesne veya veri türü, karşılık gelen bir DLL dosyasından dışa aktarılır __declspec(dllexport).


6
Tamam. Son olarak, 2 saatlik okumadan sonra, istediğim şeyin en tatmin edici, en özlü, en doğru ifadesini buldum.
el psy Congroo

1

__declspec(dllexport)derleyiciye, bağlayıcıya bu sembollerin dışa aktarma tablosuna yerleştirilmesi gerektiğini bildirmesini söyler (.dll'yi derlerken). .Dll ile bağlantı kuran programı derlerken, __declspec(dllimport)derleyiciye , normal rip-relatif kayıt-direkt yerine bir rip-göreli mutlak yazmaç-dolaylı dolaylı çağrı (bağlayıcının, içe aktarma tablosuna işaret edecek şekilde çözeceği) üretmesini söyler.tanımlanmamış bir işleve dolaylı çağrı talimatı (ki, talimatı değiştiremediği için, bağlayıcı bir thunk'ın göreceli adresini ekler ve sonra içine rip-relatif mutlak register-dolaylı dolaylı çağrıyı yerleştirdiği thunk'ı yaratır. içe aktarım tablosundaki işlev işaretçisi). Bu bir kod boyutu ve hız optimizasyonudur. Bağlayıcıya hangi sembollerin içe aktarılacağını söyleyen ve içe aktarma tablosunu oluşturmak ve .text segmentinde gerekli tüm thunk'ları oluşturmak için kılavuz olarak kullanılan içe aktarma kitaplığıdır.

https://docs.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=vs-2019 https://docs.microsoft.com/en-us/cpp / build / importing-data-using-declspec-dllimport? view = vs-2019 https://stackoverflow.com/a/4490536/7194773


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.