`WinMain @ 16 'এর অপরিবর্তিত রেফারেন্স


110

আমি যখন ব্যবহার করে কোনও প্রোগ্রাম তৈরি করার চেষ্টা করি তখন আমি Eclipse CDTনিম্নলিখিতগুলি পাই:

/mingw/lib/libmingw32.a(main.o):main.c:(.text+0x106): `উইনমেইন @ 16 এর অপরিবর্তিত রেফারেন্স

তা কেন? এবং, আমি কীভাবে এই সমস্যাটি সমাধান করতে পারি?

উত্তর:


184

নিম্নলিখিত উইন্ডোজ এপিআই-স্তর প্রোগ্রাম বিবেচনা করুন:

#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 প্রস্থান স্থিতি ফিরে এসেছে

সি: \ পরীক্ষা> _

3
@ অ্যালফ পি স্টেইনবাচ আপনার সুন্দর উত্তরের জন্য অনেক ধন্যবাদ। হিসাবে হিসাবে All you have to do is to tell Microsoft's linker which entry point to use, namely mainCRTStartup, which calls standard mainEclipse CDTকমান্ড লাইন ব্যবহার না করায় এটি করার কোনও উপায় আছে কি ? ধন্যবাদ
সরলতা

1
@ ইউজার ৫৮৮৮৫৫: যেহেতু আপনি g ++ ব্যবহার করছেন যা (সম্ভবত) আপনার ক্ষেত্রে প্রযোজ্য নয়। কেবলমাত্র শেষে (সম্ভবত) প্রয়োগ হয়। এটি হ'ল একটি mainবা একটি সংজ্ঞায়িত করুন বা WinMainপ্রাসঙ্গিক ফাইলটি প্রকল্পের অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন। চিয়ার্স,
চিয়ার্স এবং এইচটিএইচ। - আলফ

@ অ্যালফ পি স্টেইনবাচ আপনি সংজ্ঞায়িত mainবা মানে কি winmain? ধন্যবাদ
সরলতা

1
Int প্রধান () {}: আমি শুধু একটি ফাইল নামক main.cpp যে কোড ছিল প্রণীত
প্রকৃতপক্ষে

3
আমি যদি প্রতিটি ডাউনভোটার ডাউনভোটটি ব্যাখ্যা করতে পারি তবে আমি ভাল হব। সম্ভবত অন্যান্য পাঠকদের একই ভুল ধারণা রয়েছে (তা যাই হোক না কেন) এবং তারপরে আমরা এটিকে পরিষ্কার করতে পারি। প্রত্যেকের উপকার হবে, পরিবর্তে কিছুকে বিভ্রান্ত করা। সুতরাং, দয়া করে আপনার ডাউনটাতে ব্যাখ্যা করুন। ধন্যবাদ.
চিয়ার্স এবং এইচটিএইচ - আলফ

68

চিয়ার্স এবং এইচটি দ্বারা উপরের পোস্টটির সংক্ষিপ্তসার হিসাবে। - আল্ফ, নিশ্চিত হয়ে নিন যে আপনার কাছে main()বা WinMain()সংজ্ঞা রয়েছে এবং জি ++ সঠিক কাজটি করা উচিত।

আমার সমস্যাটি ছিল main()দুর্ঘটনাক্রমে একটি নেমস্পেসের ভিতরে defined


এই সমস্ত সম্পর্কে সবেমাত্র গুরুত্বপূর্ণ কিছু বুঝতে পেরেছি। আমার ক্ষেত্রে এটি মূল () খুঁজে পাচ্ছে না যেহেতু আমি কোনও যুক্তি (আরগসি, আরগভি) ঘোষণা করি নি। একবার যুক্ত হয়ে গেলে এটি প্রধান খুঁজে পেয়েছিল। এছাড়াও, কীভাবে এটি কাজ করে তার প্রকৃতির অর্থ মিংডাব্লু তার নিজস্ব প্রধান সরবরাহ করে সাহায্যের চেষ্টা করছে যা ঘুরেফিরে উইনমেইনকে কল করে। জিইউআই প্রোগ্রামগুলিতে কেবল উইনমেইন থাকত এবং সেখানে যাওয়ার জন্য মিংডাব্লুতে প্রধান স্টাব ব্যবহৃত হয়। আপনার যদি কোনও প্রধান থাকে তবে তার পরিবর্তে এটি ব্যবহার করে।
জেফ মুইর

বাহ্যিক "সি"
ইন্ট

33

এসডিএল দিয়ে আমার অ্যাপ্লিকেশনটি সংকলন করার সময় আমি এই ত্রুটির মুখোমুখি হয়েছি। এসডিএল এটির নিজস্ব মূল ফাংশন এসডিএল_মেন। H এ সংজ্ঞায়িত করার কারণে ঘটেছিল। এসডিএল প্রধান ফাংশনটি সংজ্ঞায়িত করতে একটি এসডিএল_এমএএএএচএএলএইচএলডিএইচ ম্যাক্রোকে এসডিএল এইচডি শিরোনাম অন্তর্ভুক্ত করার আগে সংজ্ঞায়িত করতে হবে।


দুর্দান্ত উত্তর! +1
মোহাম্মদ কানন

অনেক ধন্যবাদ! এই কমান্ডটি কাজ করে: gcc main.c -I "E: \ Libs \ SDL2-devel-2.0.12-mingw \ SDL2-2.0.12 \ i686-w64-mingw32 \" -I "E: \ Libs \ SDL2_ttf- devel-2.0.15-mingw \ SDL2_ttf-2.0.15 \ i686-w64-mingw32 "" -L "E: \ Libs \ SDL2-devel-2.0.12-mingw \ SDL2-2.0.12 \ i686-w64- mingw32 \ liberal এর সংক্ষিপ্ত রূপ "-L" ই: \ libs \ SDL2_ttf-devel-2.0.15-mingw \ SDL2_ttf-2.0.15 \ i686-w64-mingw32 \ liberal এর সংক্ষিপ্ত রূপ "-lSDL2 -lSDL2main -lSDL2_ttf -o app.exe
8Observer8

5

বিল্ডিংয়ের আগে আপনার .c ফাইলটি সংরক্ষণ করার চেষ্টা করুন। আমি বিশ্বাস করি যে আপনার কম্পিউটার কোনও ফাইলের অভ্যন্তরে কোনও তথ্য নেই এমন পথের উল্লেখ করছে।

- সি প্রকল্পগুলি নির্মাণের সময় একই জাতীয় সমস্যা রয়েছে ad


এটি আসলে আমার সমস্যা সমাধান করেছে এবং এটি আরও মনোযোগ পেতে সহায়তা করতে আমি এই মন্তব্যটি রেখে যাচ্ছি।
ডেভিড চেন

0

আপনার প্রকল্পে সমস্ত ফাইল অন্তর্ভুক্ত রয়েছে তা পরীক্ষা করুন:

আমি সিএলওন আপডেট করার পরে আমার এই একই ত্রুটিটি পপ আপ হয়েছিল। কয়েক ঘন্টা ঝাঁকুনির পরে, আমি লক্ষ্য করেছি যে আমার একটি ফাইল প্রকল্প লক্ষ্যতে অন্তর্ভুক্ত ছিল না। আমি এটিকে আবার সক্রিয় প্রকল্পে যুক্ত করার পরে, আমি উইনমাইন 16 এর অপরিবর্তিত রেফারেন্স এবং কোডটি সংকলন করা বন্ধ করে দিয়েছি।

সম্পাদনা: আপনার আইডিই-র মধ্যে বিল্ড সেটিংস পরীক্ষা করাও সার্থক।

(এই ত্রুটিটি সম্প্রতি আইডিই আপডেট করার সাথে সম্পর্কিত কিনা তা নিশ্চিত নয় - কার্যকারিতা বা সহজভাবে সম্পর্কিত হতে পারে that ফ্যাক্টরটি সম্পর্কে কোনও অন্তর্দৃষ্টি দিয়ে নির্দ্বিধায় মন্তব্য করুন!)

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