Qt kaynak kodunu şu şekilde gördüm:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Hangi Q_CORE_EXPORT
makro aşağıdaki gibi tanımlar:
define Q_DECL_IMPORT __declspec(dllimport)
Peki __declspec(dllimport)
gerçekten ne anlama geliyor?
Qt kaynak kodunu şu şekilde gördüm:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Hangi Q_CORE_EXPORT
makro aşağıdaki gibi tanımlar:
define Q_DECL_IMPORT __declspec(dllimport)
Peki __declspec(dllimport)
gerçekten ne anlama geliyor?
Yanıtlar:
__declspec
Microsoft'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 dllimport
ve 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 dllexport
bir DLL dosyasından verilen bir sembol olarak işaretlemek için ve kullandığınız dllimport
baş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_EXPORT
makronun yaptığı şey budur, ya Q_DECL_IMPORT
da Q_DECL_EXPORT
.
__declspec
gö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.
__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)
.
__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
Fonksiyonun tanımının dinamik bir kütüphanede olduğu anlamına gelir. Daha fazla ayrıntı ve örnekler için belgelere bakın .