উত্তর:
নিম্নলিখিত উইন্ডোজ এপিআই-স্তর প্রোগ্রাম বিবেচনা করুন:
#define NOMINMAX
#include <windows.h>
int main()
{
MessageBox( 0, "Blah blah...", "My Windows app!", MB_SETFOREGROUND );
}
এখন আসুন এটি GNU সরঞ্জামচেন (অর্থাত্ g ++) ব্যবহার করে তৈরি করুন, কোনও বিশেষ বিকল্প নেই। এখানে gnuc
আমি কেবল এটির জন্য ব্যাচ ফাইলটি ব্যবহার করছি। এটি কেবল জি ++ আরও মানক করার বিকল্প সরবরাহ করে:
সি: \ পরীক্ষা> গুনুক x.cpp সি: \ পরীক্ষা> dজডাম্প-x a.exe | সন্ধানকারী / আমি "^ সাবসিস্টেম" সাবসিস্টেম 00000003 (উইন্ডোজ সিইউআই) সি: \ পরীক্ষা> _
এই উপায়ে ডিফল্টরূপে linker একটি উত্পাদিত যে কনসোল সাব-সিস্টেম এক্সিকিউটেবল। সাব-সিস্টেম ফাইল হেডারের মধ্যে মান উইন্ডোজ বলে কি সেবা কর্মসূচি প্রয়োজন। এই ক্ষেত্রে, কনসোল সিস্টেম সহ, প্রোগ্রামটির একটি কনসোল উইন্ডো প্রয়োজন।
এর ফলে কমান্ড ইন্টারপ্রেটার প্রোগ্রামটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে।
এখন এটি GUI সাবসিস্টেম দিয়ে তৈরি করুন , যার অর্থ এই যে প্রোগ্রামটির কোনও কনসোল উইন্ডোর প্রয়োজন নেই:
সি: \ পরীক্ষা> গিনুক x.cpp -mwindows সি: \ পরীক্ষা> dজডাম্প-x a.exe | সন্ধানকারী / আমি "^ সাবসিস্টেম" সাবসিস্টেম 00000002 (উইন্ডোজ জিইউআই) সি: \ পরীক্ষা> _
আশা করি এটি এখনও পর্যন্ত ঠিক আছে, যদিও -mwindows
পতাকাটি কেবল আধা-ডকুমেন্টেড।
সেমি-ডকুমেন্টেড ফ্ল্যাগ ব্যতীত বিল্ডিংয়ের জন্য লিংকটিকে আরও নির্দিষ্টভাবে বলতে হবে কোন সাবসিস্টেমটি একটি আকাঙ্ক্ষাকে মূল্য দেয় এবং কিছু উইন্ডোজ এপিআই আমদানি গ্রন্থাগারগুলি তখন সাধারণভাবে স্পষ্টভাবে নির্দিষ্ট করতে হবে:
সি: \ পরীক্ষা> gnuc x.cpp -Wl, -সুবসিস্টেম, উইন্ডোজ সি: \ পরীক্ষা> dজডাম্প-x a.exe | সন্ধানকারী / আমি "^ সাবসিস্টেম" সাবসিস্টেম 00000002 (উইন্ডোজ জিইউআই) সি: \ পরীক্ষা> _
এটি জিএনইউ টুলচেনের সাথে দুর্দান্ত কাজ করেছে।
তবে মাইক্রোসফ্ট টুলচেইন, অর্থাৎ ভিজ্যুয়াল সি ++ সম্পর্কে কী?
ভাল, কনসোল সাবসিস্টেম এক্সিকিউটেবল হিসাবে বিল্ডিং সূক্ষ্ম কাজ করে:
সি: \ পরীক্ষা> এমএসভিসি x.cpp ব্যবহারকারী 32.lib x.cpp সি: \ পরীক্ষা> ডাম্পবিন / শিরোনাম x.exe | / i "সাবসিস্টেম" | সন্ধান করুন / i "উইন্ডোজ" সন্ধান করুন 3 সাবসিস্টেম (উইন্ডোজ সিইউআই) সি: \ পরীক্ষা> _
তবে জিইউআই সাবসিস্টেমটি মাইক্রোসফ্টের সরঞ্জামচেন বিল্ডিংয়ের সাথে ডিফল্টরূপে কাজ করে না:
সি: \ পরীক্ষা> এমএসভিসি x.cpp ব্যবহারকারী 32.lib / লিঙ্ক / সাবসিস্টেম: উইন্ডোজ x.cpp LIBCMT.lib (wincrt0.obj): ত্রুটি LNK2019: অমীমাংসিত বাহ্যিক প্রতীক _ উইনমাইন @ 16 ফাংশনে রেফারেন্স ___tmainCRTStartu পি x.exe: মারাত্মক ত্রুটি LNK1120: 1 অমীমাংসিত বহিরাগত সি: \ পরীক্ষা> _
প্রযুক্তিগতভাবে এটি হ'ল জিইউআই সাবসিস্টেমের জন্য মাইক্রোসফ্টের লিঙ্কারটি ডিফল্টরূপে মানহীন । ডিফল্টরূপে, যখন সাবসিস্টেমটি জিইউআই হয়, তারপরে মাইক্রোসফ্টের লিঙ্কার একটি রানটাইম লাইব্রেরি এন্ট্রি পয়েন্ট ব্যবহার করে , যেখানে মেশিন কোড প্রয়োগের সূচনা হয় winMainCRTStartup
, এটি মাইক্রোসফ্টকে স্ট্যান্ডার্ডের WinMain
পরিবর্তে অ- মানক বলে main
।
যদিও এটি ঠিক করার কোনও বড় বিষয় নয়।
আপনাকে যা করতে হবে তা হ'ল মাইক্রোসফ্টের লিংকটিকে বলতে হবে কোন প্রবেশের বিন্দুটি ব্যবহার করা উচিত, যাকে mainCRTStartup
মানক বলা হয় main
:
সি: \ পরীক্ষা> এমএসভিসি x.cpp ব্যবহারকারী 32.lib / লিঙ্ক / সাবসিস্টেম: উইন্ডোজ / এন্ট্রি: মেইন সিআরটিএসটিআর্টআপ x.cpp সি: \ পরীক্ষা> ডাম্পবিন / শিরোনাম x.exe | / i "সাবসিস্টেম" | সন্ধান করুন / i "উইন্ডোজ" সন্ধান করুন 2 সাবসিস্টেম (উইন্ডোজ জিইউআই) সি: \ পরীক্ষা> _
সমস্যা নেই, তবে খুব ক্লান্তিকর। এবং তাই তীক্ষ্ণ এবং লুকানো আছে যে বেশিরভাগ উইন্ডোজ প্রোগ্রামাররা, যারা বেশিরভাগ কেবল মাইক্রোসফ্টের অ-মানক-বাই-ডিফল্ট সরঞ্জামগুলি ব্যবহার করেন, তারা এটি সম্পর্কে জানেন না এবং ভুল করে মনে করেন যে উইন্ডোজ জিইউআই সাবসিস্টেম প্রোগ্রাম "অবশ্যই" স্ট্যান্ডার্ডের WinMain
পরিবর্তে মানহীন থাকতে পারে main
। পাস করার সময়, সি ++ 0x এর সাথে মাইক্রোসফ্ট এর সাথে এই সমস্যাটি তৈরি করবে, যেহেতু সংকলকটি তখন এটি নির্ধারণ করতে হবে এটি নির্ধারিত কিনা তা স্থায়ী বা হোস্টেড (হোস্ট করার সময় এটি অবশ্যই মানকে সমর্থন করবে main
)।
যাইহোক, এই কারণেই জি ++ অনুপস্থিত সম্পর্কে অভিযোগ করতে পারেWinMain
: এটি একটি নির্বোধ অ-মানক স্টার্টআপ ফাংশন যা মাইক্রোসফ্টের সরঞ্জামগুলি জিইউআই সাবসিস্টেম প্রোগ্রামের জন্য ডিফল্টরূপে প্রয়োজন।
তবে আপনি উপরে দেখতে পাচ্ছেন, জি + main
আই সাবসিস্টেম প্রোগ্রামের জন্য এমনকি জি ++ এর মান নিয়ে কোনও সমস্যা নেই ।
তাই কি সমস্যা হতে পারে?
ভাল, আপনি সম্ভবত একটি অনুপস্থিতmain
। এবং আপনার সম্ভবত কোনও (যথাযথ) নেই WinMain
! এবং তারপরে জি ++, অনুসন্ধানের পরে main
(এরকম কোনও নয়) এবং মাইক্রোসফ্টের অ-মানক WinMain
(এটির মতো নয়) অনুসন্ধান করার পরে, জানা গেছে যে পরবর্তীটি অনুপস্থিত।
খালি উত্স দিয়ে পরীক্ষা করা:
সি: \ পরীক্ষা> টাইপ নুল> y.cpp সি: \ পরীক্ষা> gnuc y.cpp -mwindows সি: / প্রোগ্রাম ফাইলগুলি / মিংডাব্লু / বিন /../ লিব / জিসিসি / মিঙ্গু 32 / 4.4.1 /../../../ libmingw32.a (main.o): main.c :(। পাঠ্য + 0xd2 ): অপরিজ্ঞাত রেফারেন সিই থেকে `উইনমাইন @ 16 ' সংগ্রহ 2: ld 1 প্রস্থান স্থিতি ফিরে এসেছে সি: \ পরীক্ষা> _
main
বা একটি সংজ্ঞায়িত করুন বা WinMain
প্রাসঙ্গিক ফাইলটি প্রকল্পের অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন। চিয়ার্স,
main
বা মানে কি winmain
? ধন্যবাদ
চিয়ার্স এবং এইচটি দ্বারা উপরের পোস্টটির সংক্ষিপ্তসার হিসাবে। - আল্ফ, নিশ্চিত হয়ে নিন যে আপনার কাছে main()
বা WinMain()
সংজ্ঞা রয়েছে এবং জি ++ সঠিক কাজটি করা উচিত।
আমার সমস্যাটি ছিল main()
দুর্ঘটনাক্রমে একটি নেমস্পেসের ভিতরে defined
এসডিএল দিয়ে আমার অ্যাপ্লিকেশনটি সংকলন করার সময় আমি এই ত্রুটির মুখোমুখি হয়েছি। এসডিএল এটির নিজস্ব মূল ফাংশন এসডিএল_মেন। H এ সংজ্ঞায়িত করার কারণে ঘটেছিল। এসডিএল প্রধান ফাংশনটি সংজ্ঞায়িত করতে একটি এসডিএল_এমএএএএচএএলএইচএলডিএইচ ম্যাক্রোকে এসডিএল এইচডি শিরোনাম অন্তর্ভুক্ত করার আগে সংজ্ঞায়িত করতে হবে।
বিল্ডিংয়ের আগে আপনার .c ফাইলটি সংরক্ষণ করার চেষ্টা করুন। আমি বিশ্বাস করি যে আপনার কম্পিউটার কোনও ফাইলের অভ্যন্তরে কোনও তথ্য নেই এমন পথের উল্লেখ করছে।
- সি প্রকল্পগুলি নির্মাণের সময় একই জাতীয় সমস্যা রয়েছে ad
আপনার প্রকল্পে সমস্ত ফাইল অন্তর্ভুক্ত রয়েছে তা পরীক্ষা করুন:
আমি সিএলওন আপডেট করার পরে আমার এই একই ত্রুটিটি পপ আপ হয়েছিল। কয়েক ঘন্টা ঝাঁকুনির পরে, আমি লক্ষ্য করেছি যে আমার একটি ফাইল প্রকল্প লক্ষ্যতে অন্তর্ভুক্ত ছিল না। আমি এটিকে আবার সক্রিয় প্রকল্পে যুক্ত করার পরে, আমি উইনমাইন 16 এর অপরিবর্তিত রেফারেন্স এবং কোডটি সংকলন করা বন্ধ করে দিয়েছি।
সম্পাদনা: আপনার আইডিই-র মধ্যে বিল্ড সেটিংস পরীক্ষা করাও সার্থক।
(এই ত্রুটিটি সম্প্রতি আইডিই আপডেট করার সাথে সম্পর্কিত কিনা তা নিশ্চিত নয় - কার্যকারিতা বা সহজভাবে সম্পর্কিত হতে পারে that ফ্যাক্টরটি সম্পর্কে কোনও অন্তর্দৃষ্টি দিয়ে নির্দ্বিধায় মন্তব্য করুন!)
All you have to do is to tell Microsoft's linker which entry point to use, namely mainCRTStartup, which calls standard main
।Eclipse CDT
কমান্ড লাইন ব্যবহার না করায় এটি করার কোনও উপায় আছে কি ? ধন্যবাদ