visual studio 2010 - সিএনআর উইন্ডোজ ফর্মের মধ্যে LNK2005 ত্রুটি



visual-studio-2010 visual-c++ (1)

আমি কনসোল প্রোগ্রাম হিসাবে পরিচালনা করছি এমন কিছু কোডের জন্য জিইউআই ইন্টারঅ্যাকশন তৈরি করতে একটি উইন্ডোজ সিএলআর ফর্ম তৈরির জন্য কাজ করছি।

আমি যখন কোডটির কনসোল অংশে শিরোনামটি অন্তর্ভুক্ত করি তখন আমার উভয় শিরোনামই একত্রে দুর্দান্ত খেলেন, কিন্তু আমি যখন ফর্মটিতে অন্তর্ভুক্ত করার চেষ্টা করি তখন তারা নিম্নলিখিতটির ফলাফল দেয়:

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: ইঙ্গিত_এলিসিটার.ওজেজে ইতিমধ্যে সংক্ষিপ্ততর সংজ্ঞা দেওয়া হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি LNK2005: _ কিলডিএলএল ইতিমধ্যে অঙ্গভঙ্গি_এলিসিটার.ওবিজে সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: ইঙ্গিত_এলিসিটার.ওবজে ইতিমধ্যে সংক্ষিপ্তসার_সিনফ্রেইক 2 সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.বজ: ত্রুটি LNK2005: _ সংযোগড্রাইভার ইতোমধ্যে Gesture_Elicitor.obj এ সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.বজ: ত্রুটি এলএনকে ২০০৩: _ গেটডভাইসটি ইতিমধ্যে ইঙ্গিত_এলিকিটর.ওবজে সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: ইঙ্গিত_এলসিটার.ওজেজে ইতিমধ্যে সংক্ষিপ্তসার_সেইনফ্রেইক_ফাইন 2 সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.বজ: ত্রুটি এলএনকে ২০০৫: _ সংযুক্তি ইতিমধ্যে ইঙ্গিত_এলিকিটর.ওবজে সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: জিটচার_এলজিটার.ওজেজে ইতিমধ্যে সংজ্ঞা দেওয়া হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: জেটচার_এলজিটার.ওবজে ইতিমধ্যে সংক্ষিপ্তসার_সেইটসিনফ্রেইক 1

লাইব্রেরিস্টেস্ট.বজ: ত্রুটি LNK2005: _GETLastEAIError ইতিমধ্যে অঙ্গভঙ্গি_এলিসিটার.ওবজে সংজ্ঞায়িত করা হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: জেসচার_এলিসিটার.ওবজে সংক্ষিপ্তসারগুলি ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে

লাইব্রেরিস্টেস্ট.বজ: ত্রুটি LNK2005: _ সংযুক্তি ইতিমধ্যে অঙ্গভঙ্গি_এলিসিটার.ওবজে সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি LNK2005: _ রেডএফডাব্লুওয়্যার ইতিমধ্যে অঙ্গভঙ্গি_এলিসিটার.ওবিজে সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: ইঙ্গিত_এলসিটার.ওবজে ইতিমধ্যে সংক্ষিপ্তসার_সিনটফ্রেইক_ফাইন 1

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি LNK2005: _সেটসিগ সিআরসিআর ইতোমধ্যে অঙ্গভঙ্গি_এলিসিটার.ওবিজে সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: _ ক্লসপোর্ট ইতিমধ্যে ইঙ্গিত_এলিসিটার.ওবজে সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.বজ: ত্রুটি LNK2005: _ShowDebugInfo ইতোমধ্যে Gesture_Elicitor.obj এ সংজ্ঞায়িত করা হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: _অপেনপোর্ট ইতিমধ্যে ইঙ্গিত_এলিসিটার.ওবজে সংজ্ঞায়িত

লাইব্রেরিস্টেস্ট.বজ: ত্রুটি LNK2005: _ আবিষ্কার ডিভাইসগুলি ইতিমধ্যে অঙ্গভঙ্গি_এলিসিটার.ওবিজে সংজ্ঞায়িত করা হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি LNK2005: _TacOnTime ইতোমধ্যে Gesture_Elicitor.obj এ সংজ্ঞায়িত হয়েছে

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: জেলস_এলসিটার.ওজেজে ইতিমধ্যে সংজ্ঞায়িত_পুলসঅনটাইম

লাইব্রেরিস্টেস্ট.ওব্জ: ত্রুটি এলএনকে ২০০৫: _টেক্টরহ্যান্ডেল ইতিমধ্যে ইঙ্গিত_এলিসিটার.ওজেজে সংজ্ঞায়িত হয়েছে

....

মজার সমস্যাটি হ'ল আমার এক শিরোলেখ ("wiimote.h", ওয়াইআরসেলফ প্রকল্প থেকে) কেবলমাত্র যদি এতে অন্তর্ভুক্ত থাকে তবে তা ঠিকভাবে কাজ করে। সমস্যাটি "কৌশল_cHeader.h" এর সাথে রয়েছে, এটি এর .dll এর সাথে সংযোগ স্থাপন করে। প্রশ্নের সংক্ষিপ্ত কোডটি নিম্নরূপ:

#ifndef TACTOR_H_
#define TACTOR_H_

using namespace std;

#include <windows.h>

...

typedef int (*ConnectDirectPtr)(char*name, int type);
typedef int (*TacOnTimePtr)(int cidx, int board, int tacNum, int durMilli, bool returnifprocessing);
typedef int (*SetFreqPtr)(int cidx, int board, int freq, bool returnifprocessing);
typedef int (*KillDLLptr)();
typedef int (*SeqWaitPtr)(int cidx, int board, int waitTime, bool returnifprocessing);
...

ConnectDirectPtr ConnectDirect;
TacOnTimePtr TacOnTimeForTaction;
SetFreqPtr SetSinFreq1;
SetFreqPtr SetSinFreq2;
KillDLLptr KillDLL;
SeqWaitPtr SeqWait;
...

HINSTANCE tactorhandle = NULL;

inline int InitTactorDLL()
{
    tactorhandle = LoadLibrary("Tactor_DLL.dll");
    if (tactorhandle == 0)
        return -1;
    SeqWait = (SeqWaitPtr)GetProcAddress(tactorhandle, "SeqWait");
    ConnectDirect = (ConnectDirectPtr)GetProcAddress(tactorhandle, "ConnectDirect");
    TacOnTime = (TacOnTimePtr)GetProcAddress(tactorhandle, "TacOnTime");
    SetSinFreq1 = (SetFreqPtr)GetProcAddress(tactorhandle, "SetSinFreq1");
    SetSinFreq2 = (SetFreqPtr)GetProcAddress(tactorhandle, "SetSinFreq2");
    KillDLL = (KillDLLptr)GetProcAddress(tactorhandle, "KillDLL");
}

#endif

সুতরাং এই শিরোলেখ সম্পর্কে কী এটি আমার ফর্মের সাথে ভাল খেলছে না?


দেরী উত্তর দেওয়ার জন্য দুঃখিত।

সমস্যাটি সহজ, আপনার শিরোনাম ফাইলের ভিতরে আপনার পরিবর্তনশীল সংজ্ঞা রয়েছে । সাধারণত, একটি শিরোনাম ফাইলে কেবলমাত্র ঘোষণা থাকতে হবে। [SO] পরীক্ষা করুন : সংজ্ঞা এবং ঘোষণার মধ্যে পার্থক্য কী? উভয়ের মধ্যে পার্থক্য দেখতে।

ঠিক করার জন্য , আপনার এগুলি সরানো উচিত:

ConnectDirectPtr ConnectDirect;
TacOnTimePtr TacOnTimeForTaction;
SetFreqPtr SetSinFreq1;
SetFreqPtr SetSinFreq2;
KillDLLptr KillDLL;
SeqWaitPtr SeqWait;
//...

HINSTANCE tactorhandle = NULL;

.c উত্স ফাইলটিতে সত্যই তাদের প্রয়োজন হয় বা তাদের বাহ্যিক ( [এমএস। ডকস]: বাহ্যিক (সি ++) ) তৈরি করুন।

ব্যাকগোন্ড :

পোর্টেবল এক্সিকিউটেবল কোডে সি ( সি ++ ) কোড তৈরি করার সময় 3 টি পর্যায় রয়েছে (এখানে আমি .exe এবং .dll ফাইলগুলি উল্লেখ করছি)। আরও তথ্যের জন্য, [এমএস.ডক্স] দেখুন: পিইয়ের ভিতরে পিয়ারিং: উইন 32 পোর্টেবল এক্সিকিউটেবল ফাইল ফর্ম্যাটটির একটি ট্যুর :

  1. Preprocess

    • প্রিপ্রোসেসর দ্বারা সম্পন্ন ( cl.exe : [MS.Docs]: সংকলক বিকল্প বর্ণানুক্রমিকভাবে তালিকাভুক্ত ) যা সংকলকও (পরবর্তী পর্বটি পরীক্ষা করে দেখুন); এটি ডিফল্টরূপে একটি নীরব পর্যায় (আপনি এর ফলাফল আউটপুট / ই , / ইপি বা / পি উল্লেখ করে দেখতে পারেন)
    • প্রতিটি উত্স ( .c , .cpp , .cxx , c ++ , ...) ফাইলের জন্য, এটি সমস্ত প্রাক - প্রসেসিং নির্দেশিকা ( [এমএস। ডকস]: প্রিপ্রেসেসর দিকনির্দেশনা ) পরিচালনা করে (যেমন: #define , #if , # অন্তর্ভুক্ত ,। ..); ফলাফলটি এখনও একটি .c ( .cpp , ...) ফাইল (মূল থেকে পৃথক, সাধারণত উল্লেখযোগ্যভাবে বড়) হয় যাকে সংকলন বা অনুবাদ ইউনিটও বলা হয়
    • যখন # অন্তর্ভুক্ত নির্দেশিকাটির মুখোমুখি হয়, তখন নির্দেশিকাটি অন্তর্ভুক্ত করে এমন লাইনটি (কোডের প্রতিটি লাইনে কেবল একটি ফাইল অন্তর্ভুক্ত থাকে) কেবল ( .h বা এমনকি .c ( .cpp , ...)) ফাইলের বিষয়বস্তু দ্বারা প্রতিস্থাপন করা হয় অন্তর্ভুক্ত করা হয়েছে। দ্রষ্টব্য যে এটি পুনরাবৃত্তভাবে সম্পন্ন করা হয় (যদি ফাইলটি নিজেই অন্তর্ভুক্ত থাকে তবে সেগুলি প্রসারিত করার মতো # অন্তর্ভুক্ত নির্দেশাবলীও অন্তর্ভুক্ত রয়েছে)। মূল উত্স ফাইলটি প্রিপ্রোসেসড একের চেয়ে অনেক ছোট, যা প্রাকপ্রসেসর অস্তিত্বের অন্যতম কারণ
  2. সঙ্কলন করা

    • সংকলক দ্বারা সম্পন্ন (পূর্ববর্তী পর্বটি পরীক্ষা করুন)
    • পূর্ববর্তী পর্যায়ে উত্পন্ন প্রতিটি অনুবাদ ইউনিট সি ( সি ++ ) কোড (মানব পাঠযোগ্য) থেকে মেশিন কোডে ( সিপিইউ "পাঠযোগ্য") বা সিওএফএফ ফর্ম্যাটে ( [এমএস। ডকস: পিই ফর্ম্যাট ) রূপান্তরিত হয় । এটি ভিজি প্রকল্পের মধ্যস্থতাকারী ডিরেক্টরিতে দেখা যাবে এটি ( অবজেক্ট) ফাইল (এর বিষয়বস্তু গীব্রিশ - কমপক্ষে 1 দৃষ্টি) that
    • নোট করুন যে প্রকল্পে অন্তর্ভুক্ত প্রতিটি উত্স ফাইলের জন্য, এই পর্বের পরে একটি সম্পর্কিত .obj ফাইল থাকবে
  3. লিংক

    • লিঙ্কারের দ্বারা সম্পন্ন ( link.exe : [MS.Docs]: লিংকার বিকল্প )
    • পূর্ববর্তী পর্বের সমস্ত অবজেক্ট ফাইলগুলি একত্রে মার্জ করা হয়েছে ( .bib ফাইলগুলির একগুচ্ছ সাথে যার বিষয়বস্তু .obj ফাইলের অনুরূপ, তবে সেগুলি কেবল পরোক্ষভাবে ব্যবহার করা যেতে পারে - অ্যাপ তৈরি করার সময় ) এবং আরও কিছু অতিরিক্ত ক্রিয়াকলাপ (যেমন পিই যোগ করা) বিভাগ এবং শিরোনাম, কিছু কোড স্থানান্তরিত, অব্যবহৃত কোড অপসারণ, ...) প্রকল্পের চূড়ান্ত নিদর্শনগুলিতে ( exeিপি বা ডেল )

দ্রষ্টব্য : এটি উইন নির্দিষ্ট, নিক্সের জন্য পর্যায়গুলি (প্রায়) একই, সরঞ্জাম পৃথক।

আপনার কোডে কি ঘটে:

  • ফাইল টেকটি। H (আমি ধরে নিচ্ছি এটি এটির নাম, শুরুতে অন্তর্ভুক্ত গার্ডের উপর ভিত্তি করে) ভেরিয়েবল সংজ্ঞা সংকলন ধারণ করে; আমি উদাহরণ হিসাবে HINSTANCE tactorhandle নিচ্ছি
  • ফাইলস
  • প্রথম ধাপে , ট্র্যাক্টর। দুই .c ফাইলগুলিতে (স্বতন্ত্রভাবে) প্রসারিত হবে। সুতরাং, উভয় অনুবাদ ইউনিটে টাক্টোরিচেন্ডাল ভেরিয়েবল থাকবে
  • দ্বিতীয় ধাপে , পূর্ববর্তী পদক্ষেপের 2 টি অনুবাদ ইউনিট সংকলিত হয় এবং অবজেক্ট ফাইলে পরিণত হয়, যেহেতু তাদের কোডটি সিনট্যাক্টিকভাবে সঠিক
  • ফেজ 3 এ , 2 অবজেক্ট ফাইলগুলির সংমিশ্রণের সময়, লিঙ্কারটি দেখতে পায় যে তাদের উভয়টিতে টাকটোরিডল উপস্থিত রয়েছে এবং তারপরে উপরের ত্রুটিগুলি ছুঁড়ে ফেলে

দ্রষ্টব্য :





visual-c++