__declspec (dllimport) আসলে কী বোঝায়?


92

আমি কিউটি উত্স কোড এর মতো দেখেছি:

class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};

কোন Q_CORE_EXPORTম্যাক্রো নীচের মত সংজ্ঞা দেয়:

define Q_DECL_IMPORT __declspec(dllimport)

সুতরাং আসলে __declspec(dllimport)কি মানে?


উত্তর:


118

__declspecএকটি মাইক্রোসফ্ট-নির্দিষ্ট বৈশিষ্ট্য যা আপনাকে স্টোরেজ-শ্রেণীর তথ্য নির্দিষ্ট করতে দেয়।
(নিতপিকারের কর্নার: তবে, অন্যান্য সংকলক বিক্রেতারা যেমন জিসিসি — এখন মাইক্রোসফ্টের সংকলকগুলিকে লক্ষ্য করে লেখা কোডের ইনস্টলড বেসের সাথে সামঞ্জস্যের জন্য এই ভাষা বর্ধনকে সমর্থন করে Some কেউ কেউ অতিরিক্ত স্টোরেজ-শ্রেণীর বৈশিষ্ট্যও সরবরাহ করে))

ঐ স্টোরেজ ক্লাসের চারিত্রিক বৈশিষ্ট্য আছে যেগুলো নির্দিষ্ট করা যেতে পারে দুটি dllimportএবং dllexport। এগুলি সংকলককে নির্দেশ করে যে কোনও ফাংশন বা অবজেক্ট একটি ডিএলএল থেকে আমদানি বা রফতানি করা হয় (যথাক্রমে)।

আরও নির্দিষ্টভাবে, তারা মডিউল-সংজ্ঞা প্রয়োজন ছাড়াই ক্লায়েন্টের কাছে ডিএলএল এর ইন্টারফেস সংজ্ঞায়িত করে (.DEF ) ফাইলের । বেশিরভাগ লোকেরা এই ভাষা এক্সটেনশানগুলি ডিইএফ ফাইল তৈরির চেয়ে বেশি সহজ ব্যবহার করে।

সুস্পষ্ট কারণে __declspec(dllimport)এবং __declspec(dllexport)সাধারণত একে অপরের সাথে জুড়ি দেওয়া হয়। আপনি dllexportকোনও ডিএলএল থেকে রফতানি হিসাবে প্রতীক চিহ্নিত করতে ব্যবহার করেন এবং আপনি dllimportঅন্য রফতানি হওয়া প্রতীকটি আমদানি করতে ব্যবহার করেন।

এর কারণ হিসাবে এবং ডিএলএল সংকলন করার সময় এবং ডিএলএল ইন্টারফেস গ্রাহক ক্লায়েন্ট কোডে একই হেডার ফাইলটি সাধারণত ব্যবহৃত হয়, ম্যাক্রো সংজ্ঞায়িত করার জন্য এটি একটি সাধারণ প্যাটার্ন যা স্বয়ংক্রিয়ভাবে সংকলনের সময় উপযুক্ত বৈশিষ্ট্য বিশিষ্টতার সাথে সমাধান হয় ol উদাহরণ স্বরূপ:

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

এবং তারপরে রফতানি করা উচিত এমন সমস্ত চিহ্ন চিহ্নিত করে DLLEXPORT

সম্ভবত, Q_CORE_EXPORTম্যাক্রো যা তা করে তা সমাধান করে Q_DECL_IMPORTবা হয় Q_DECL_EXPORT


__ডেস্কস্পেক সঠিকভাবে "এমএস-নির্দিষ্ট" নয় (এটি আরও অনেক বেশি "সংকলক নির্দিষ্ট) এবং কিছু সংকলক একাধিক প্ল্যাটফর্মের জন্যও এই ঘোষণাটি ব্যবহার করেন Some কিছু বৈশিষ্ট্যের মানগুলি হ'ল (ডিএলএক্সপোর্ট / ডেলিম্পোর্টগুলি এমএস নির্দিষ্ট, আসলে, যেহেতু ডিএলএল এমএস হয় অভিধান)।
এমিলিও গারাভাগলিয়া

9
@ এমিলিও: আমি যতদূর জানি, মাইক্রোসফ্ট __declspecসি ++ ভাষাতে এক্সটেনশন হিসাবে স্বরলিপিটি আবিষ্কার করেছিলেন । আমি বিশ্বাস করি যে জিসিসি এখন এটি সমর্থন করে তবে এটি মূলত মাইক্রোসফ্টের সংকলকগুলির সাথে সামঞ্জস্যতার কারণে। এবং "এমএস-নির্দিষ্ট" কীভাবে "সংকলক নির্দিষ্ট" থেকে আলাদা তা আমি বুঝতে পারি না। মাইক্রোসফ্ট একটি সি ++ সংকলক লিখেছিল এবং প্রচুর লোক এটি ব্যবহার করে। এটি ভিজ্যুয়াল স্টুডিও সহ আসে।
কোডি ধূসর

8
মাইক্রোসফ্ট একটি সংকলক তৈরি করে। একে "মাইক্রোসফ্ট সি / সি ++ অপটিমাইজিং কমপাইলার", ক্লি.এক্স.সি বলা হয়। প্রচুর লোক ভুল করে ভিজ্যুয়াল স্টুডিওতে উল্লেখ করে যেন এটি একটি সংকলক, তবে এটি একটি আইডিই। আমি জানি না যে লোকেরা "মাইক্রোসফ্ট-নির্দিষ্ট" এর অর্থ কী তা নিয়ে বাছাই করছে। এর অর্থ একটি "এমএস এনভায়রনমেন্ট" (যা কিছু হোক না কেন), এবং এর অর্থ অবশ্যই "উইন্ডোজ" নয়। হ্যাঁ, অন্যান্য সংকলক বিক্রেতারা এখন মাইক্রোসফ্ট সংকলককে লক্ষ্য করে লিখিত কোডের ইনস্টলড বেসের সাথে সামঞ্জস্য করার জন্য এক্সটেনশানটিকে সমর্থন করে। আমি আগে যেমন বলেছি, যতদূর আমি সচেতন, মাইক্রোসফ্ট সিনট্যাক্সটি আবিষ্কার করেছিল। এখানে পয়েন্টটি তৈরি করা হয়েছে।
কোডি ধূসর

4
@ কোডি গ্রে: মাইক্রোসফ্ট এটি একা আবিষ্কার করেছে তা যথেষ্ট হবে না। তবে মাইক্রোসফ্ট এটি আবিষ্কার করেছে, এতে কোনও মান নেই, অন্যরা কেবল এটি সামঞ্জস্যের জন্য প্রয়োগ করে এবং এটি মূলত মাইক্রোসফ্ট উইন্ডোজকে লক্ষ্য করে কর্মসূচির জন্য ব্যবহার করে (একচেটিয়াভাবে নয়) একসাথে এটি "মাইক্রোসফ্ট নির্দিষ্ট"
সেলটস্ক

6
এটি একটি দুর্দান্ত উত্তর, বিশেষত "ডিএলএল কম্পাইল করার সময় এবং ক্লায়েন্ট কোডে একই হেডার ফাইলটি সাধারণত ব্যবহৃত হয়" এর অংশটি সম্পর্কে! আমদানি / রফতানি-স্টাফের স্ফটিকের প্রতিটি দিক পরিষ্কার করে তোলে।
ইলা 782

30

__declspec(dllimport) একটি স্টোরেজ-ক্লাস স্পেসিফায়ার যা সংকলককে বলে যে কোনও ফাংশন বা অবজেক্ট বা ডেটা টাইপ একটি বাহ্যিক ডিএলএলে সংজ্ঞায়িত।

ফাংশন বা অবজেক্ট বা ডেটা প্রকারটি কোনও ডিএলএল থেকে সংশ্লিষ্ট সাথে রফতানি করা হয় __declspec(dllexport)


6
ঠিক আছে. অবশেষে, 2 ঘন্টা পড়ার পরে, আমি সবচেয়ে সন্তোষজনক, সর্বাধিক সংক্ষিপ্ত, আমি যা চাই তার পয়েন্ট স্টেটমেন্টের সাথে সঠিক পেলাম।
এল সাইক কংগ্রো

1

__declspec(dllexport)সংযোগকারীকে লিঙ্কারকে অবহিত করতে জানায় যে এই চিহ্নগুলি রফতানি টেবিলের মধ্যে স্থাপন করা প্রয়োজন (.dll সংকলন করার সময়)। .Dll এর সাথে লিঙ্কযুক্ত প্রোগ্রামটি সংকলন করার সময়, __declspec(dllimport)কম্পাইলারকে একটি চুরি-সম্পর্কিত আপাত নিখুঁত রেজিস্ট্রার-পরোক্ষ পরোক্ষ কল (যা লিঙ্কার আমদানির টেবিলের দিকে ইঙ্গিত করার সংকল্প পূরণ করবে) উত্সাহিত করতে না করে বরং সরাসরি চিপ-সম্পর্কিত পরোক্ষ কল নির্দেশ একটি অনির্ধারিত ফাংশনে (যা এটি নির্দেশকে পরিবর্তন করতে পারে না) উত্পাদন করতে বলে, লিঙ্কারটির আপেক্ষিক ঠিকানা সন্নিবেশ করায় একটি থাঙ্ক এবং তারপরে থাঙ্ক তৈরি করে, যার ভিতরে এটি চুরি-সম্পর্কিত আপাত নিখুঁত রেজিস্টার-পরোক্ষ পরোক্ষ কল আমদানি সারণীতে ফাংশন পয়েন্টারে প্রেরণ করে)। এটি একটি কোড আকার এবং গতি অপ্টিমাইজেশন। এটি আমদানি গ্রন্থাগার .lib যা সংযোগকারীকে জানায় যে কোন চিহ্নগুলি আমদানি করা হবে এবং আমদানি সারণী তৈরি করতে এবং .text বিভাগে কোনও প্রয়োজনীয় থঙ্ক তৈরি করতে গাইড হিসাবে ব্যবহৃত হয়।

https://docs.microsoft.com/en-us/cpp/build/importing-function-calls- using-declspec- dllimport? view = vs- 2019 https://docs.microsoft.com/en-us/cpp / বিল্ড / আমদানি-ডেটা ব্যবহার করে-ডেলস্পেক-ডেলিম্পোর্ট? ভিউ = বনাম -2018 https://stackoverflow.com/a/4490536/7194773


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.