LNK2019 ত্রুটিটি কীভাবে সমাধান করবেন: অমীমাংসিত বাহ্যিক প্রতীক - ফাংশন?


101

আমি এই ত্রুটি পেয়েছি, তবে কীভাবে এটি ঠিক করতে হয় তা আমি জানি না।

আমি ভিজ্যুয়াল স্টুডিও 2013 ব্যবহার করছি I আমি সমাধানটির নাম দিয়েছি মাইপ্রজেক্টেস্ট এটি আমার পরীক্ষার সমাধানের কাঠামো:

গঠন

- ফাংশন

#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

int multiple(int x, int y);
#endif

-ফানশন.সি.পি.

#include "function.h"

int multiple(int x, int y){
    return x*y;
}

- main.cpp

#include <iostream>
#include <cstdlib>
#include "function.h"
using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    cout << multiple(a, b) << endl;

    system("pause");
    return 0;
}

আমি শিক্ষানবিশ; এটি একটি সাধারণ প্রোগ্রাম এবং এটি ত্রুটি ছাড়াই চলে। আমি ইন্টারনেটে পড়েছি এবং ইউনিট পরীক্ষায় আগ্রহী হয়েছি, তাই আমি একটি পরীক্ষার প্রকল্প তৈরি করেছি:

ফাইল> নতুন> প্রকল্প ...> ইনস্টলড> টেমপ্লেটস> ভিজ্যুয়াল সি ++> পরীক্ষা> নেটিভ ইউনিট টেস্ট প্রকল্প>

নাম: ইউনিটটেষ্ট 1 সমাধান: সমাধানে যুক্ত করুন তারপরে অবস্থানটি বর্তমান উন্মুক্ত সমাধানের পথে স্বয়ংক্রিয়ভাবে স্যুইচ করা এটি সমাধানটির ফোল্ডার কাঠামো:

ফোল্ডার কাঠামো

আমি কেবল ফাইল ইউনিটেস্ট 1 সিপিপি সম্পাদনা করেছি:

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../MyProjectTest/function.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{       
    TEST_CLASS(UnitTest1)
    {
    public:

        TEST_METHOD(TestEqual)
        {

            Assert::AreEqual(multiple(2, 3), 6);
            // TODO: Your test code here
        }

    };
}

তবে আমি ত্রুটি পেয়েছি LNK2019: অমীমাংসিত বাহ্যিক প্রতীক। আমি জানি যে একাধিক ফাংশন বাস্তবায়ন অনুপস্থিত। আমি ফাংশন সিপিপি ফাইলটি মুছে ফেলার চেষ্টা করেছি এবং আমি ঘোষণাকে সংজ্ঞা দিয়ে প্রতিস্থাপন করেছি এবং এটি চলে। তবে একই ফাইলটিতে ঘোষণা এবং সংজ্ঞা উভয়ই লেখার পরামর্শ দেওয়া হয় না। আমি না করে কীভাবে এই ত্রুটিটি সমাধান করতে পারি? আমার #include "../MyProjectTest/function.cpp"ফাইল ইউনিটেস্টেপিপি দিয়ে প্রতিস্থাপন করা উচিত? (আমি ইংরেজিতে খুব একটা ভাল না। ধন্যবাদ)



7
যত্নবান হন একটি উইন্ডোজ পরিবেশে, স্ট্যাটিক লাইব্রেরিতে একটি .LIBফাইল এক্সটেনশন থাকে। জিনিসগুলিকে জটিল করার জন্য ... ডায়নামিক লিঙ্ক লাইব্রেরিগুলির (অর্থাত্ *.DLL) সাথে একটি আমদানি গ্রন্থাগার থাকতে পারে যার একটি .LIBফাইল এক্সটেনশনও রয়েছে। এই আমদানি গ্রন্থাগারটি দ্বারা সরবরাহিত সমস্ত গুডিকে তালিকাবদ্ধ করে *.DLL। আরও তথ্যের জন্য, দয়া করে পড়ুন: লিঙ্কার্সের জন্য প্রারম্ভিকের গাইড
প্রেসকাকো

6
কেন সে সাবধান হবে ??
মার্শাল নৈপুণ্য

উত্তর:


83

একটি বিকল্প function.cppআপনার UnitTest1প্রকল্পে অন্তর্ভুক্ত করা হবে , কিন্তু এটি সবচেয়ে আদর্শ সমাধান কাঠামো নাও হতে পারে। আপনার সমস্যার সংক্ষিপ্ত উত্তরটি হ'ল আপনার UnitTest1প্রকল্পটি তৈরি করার সময়, সংকলক এবং লিঙ্কারের কোনও উপস্থিতি নেই যা function.cppউপস্থিত রয়েছে এবং এর সংজ্ঞা সংযুক্ত করার জন্য লিঙ্কের কিছুই নেই multiple। এটির সমাধানের একটি উপায় হ'ল লাইব্রেরি সংযোগ স্থাপন করা।

যেহেতু আপনার ইউনিট পরীক্ষাগুলি অন্য কোনও প্রকল্পে রয়েছে, আমি ধরে নিচ্ছি আপনার উদ্দেশ্যটি সেই প্রকল্পটিকে একক ইউনিট পরীক্ষার প্রোগ্রাম হিসাবে পরিণত করা make আপনি যে প্রকল্পটি অন্য কোনও প্রকল্পে অবস্থিত এটি পরীক্ষা করে এই প্রকল্পটি গতিশীল বা স্থিতিশীলভাবে সংযুক্ত লাইব্রেরিতে তৈরি করা সম্ভব। স্ট্যাটিক লাইব্রেরিগুলি নির্মাণের সময় অন্যান্য প্রোগ্রামগুলির সাথে লিঙ্কযুক্ত থাকে এবং এতে এক্সটেনশন থাকে .libএবং গতিশীল লাইব্রেরি রানটাইমের সময় সংযুক্ত থাকে এবং এক্সটেনশন থাকে .dll। আমার উত্তরের জন্য আমি স্ট্যাটিক লাইব্রেরি পছন্দ করব।

আপনি আপনার প্রথম প্রোগ্রামটিকে প্রকল্পের বৈশিষ্ট্যগুলিতে পরিবর্তন করে স্ট্যাটিক লাইব্রেরিতে পরিণত করতে পারেন। জেনারেল ট্যাবের অধীনে এমন একটি বিকল্প থাকতে হবে যেখানে প্রকল্পটি নির্বাহযোগ্য ( .exe) রূপান্তর করতে সক্ষম হয় । আপনি এটিতে পরিবর্তন করতে পারেন .lib.libফাইল হিসাবে একই জায়গায় গড়ে তুলবে .exe

আপনার UnitTest1প্রকল্পে, আপনি এর বৈশিষ্ট্যগুলিতে যেতে পারেন, এবং অতিরিক্ত লাইব্রেরি ডিরেক্টরি বিভাগে লিংকার ট্যাবটির অধীনে, তৈরির পথে যুক্ত করতে পারেন MyProjectTest। তারপরে, লিংকার - ইনপুট ট্যাবের অধীনে অতিরিক্ত নির্ভরতাগুলির জন্য, আপনার স্থির লাইব্রেরির নাম যুক্ত করুন, সম্ভবত MyProjectTest.lib

এটি আপনার প্রকল্পটি তৈরি করার অনুমতি দেয়। মনে রাখবেন যে এটি করার দ্বারা, MyProjectTestস্ট্যান্ডেলোন এক্সিকিউটেবল প্রোগ্রাম হবে না যতক্ষণ না আপনি তার বিল্ড বৈশিষ্ট্যগুলি প্রয়োজন হিসাবে পরিবর্তন করেন, যা আদর্শের চেয়ে কম হবে।


'লিংকার-> ইনপুট ট্যাব'-এ, আমাকে স্ট্যাটিক লাইব্রেরির জন্য' (আউটডির) 'উপস্থাপন করতে হয়েছিল, এটি' $ (আউটডায়ার) মাইপ্রজেক্টটস্ট.লিব ', যদিও' মাইপ্রজেক্ট 'এবং' মাইস্টেস্টপ্রজেক্ট 'উভয়ের অবস্থান একই মূল ফোল্ডারে রাখা হয়েছে ।
পবিित्र দাশ

16
সুতরাং প্রতিবার যখন আপনি ইউনিট পরীক্ষা চালাতে চান তখন আপনার টেস্টি প্রকল্পটি একটি স্ট্যাটিক লাইব্রেরিতে রূপান্তর করা উচিত এবং প্রতিবার যেখানে আপনি আসলে আপনার প্রোগ্রামটি চালাতে চান সেখানে আপনি এটিকে এক্সিকিউটেবলে রূপান্তর করতে পারেন, এটি কীভাবে সমাধান?
উঃ স্মোলিয়াক

4
যদি মাইপ্রজেক্টটেষ্টটি একটি dll হয়, আমরা কি এটি পরীক্ষা করতে পারি? আমরা কেবল আমদানি লিবি যুক্ত করব বা আমাদের অবশ্যই যুক্ত ফাইলগুলি যুক্ত করতে হবে?
এভাইট করুন

"আপনি আপনার প্রথম প্রোগ্রামটিকে প্রকল্পের বৈশিষ্ট্যগুলিতে পরিবর্তন করে স্ট্যাটিক লাইব্রেরিতে পরিণত করতে পারেন the জেনারেল ট্যাবের অধীনে একটি বিকল্প থাকা উচিত যেখানে প্রকল্পটি নির্বাহযোগ্য (.exe) হিসাবে সেট করতে প্রস্তুত হয় You আপনি এটি পরিবর্তন করতে পারেন। .Lib ফাইলটি .exe হিসাবে একই জায়গায় তৈরি করবে "এটি করা আমার ক্ষেত্রে যথেষ্ট ছিল। বাকিগুলি ইতিমধ্যে ভিএস দ্বারা পরিচালিত হয়েছিল
একরেম সোলমাজ

39

ভিজ্যুয়াল স্টুডিও সলিউশন ট্রিতে 'ইউনিটটেষ্ট 1' প্রকল্পে ডান ক্লিক করুন তারপরে যুক্ত করুন -> বিদ্যমান আইটেমটি -> ফাইলটি চয়ন করুন ../MyProjectTest/function.cpp


4
নোট করুন যে প্রকৃত ফাইল (গুলি) অনুলিপি করা হয়নি বা প্রজাদিরে সরানো হয়নি।
লরি স্টারন

এই পদ্ধতিটি সিএলআই প্রকল্পে c ++ lib যুক্ত করার চেষ্টা করে একই রকম সমস্যাগুলির সমাধান করেছে।
দেশান

17

যেহেতু আমি চাই যে আমার প্রকল্পটি একটি স্বতন্ত্র EXE তে সংকলিত হোক, তাই আমি ইউনিট টেস্ট প্রকল্পটি ফাংশন.cpp থেকে উত্পন্ন ফাংশন.ওব ফাইলের সাথে সংযুক্ত করেছি এবং এটি কাজ করে। 'ইউনিটটেষ্ট 1' প্রকল্প> কনফিগারেশন বৈশিষ্ট্য> লিংক> ইনপুট> অতিরিক্ত নির্ভরতা> যুক্ত ".. \ মাইপ্রজেক্টটেষ্ট \ ডিবাগ \ ফাংশন.ওবজ" এ ডান ক্লিক করুন "


4
মাইপ্রজেক্টস্টেস্ট একটি ডেল হলে কীভাবে কেস হয়? আপনি এটি জন্য সেট করতে পারেন?
এগারটায় এভিয়েট করুন

আমাদের যদি অনেক আপত্তি ফাইল থাকে। আমরা কি এই * .obj এর মতো কিছু যুক্ত করতে পারি? আপনার সমাধানটি আমার সাথে কাজ করেছে তবে আমি প্রতিটি নতুন اعتراض ফাইল ম্যানুয়ালি যুক্ত করতে চাই না।
এভায়াইট 11:30

10

আমি কেবল ভিজ্যুয়াল স্টুডিও 2013 এ এই সমস্যায় পড়েছি App দৃশ্যত এখন, একই সমাধানে দুটি প্রকল্প থাকা এবং নির্ভরতা নির্ধারণ করা যথেষ্ট নয়। আপনি তাদের মধ্যে একটি প্রকল্প রেফারেন্স যুক্ত করতে হবে। এটা করতে:

  1. সমাধানটি অন্বেষণে প্রকল্পটিতে ডান ক্লিক করুন
  2. অ্যাড => রেফারেন্স ... ক্লিক করুন
  3. নতুন রেফারেন্স যুক্ত করুন বোতামটি ক্লিক করুন
  4. এই প্রকল্পের উপর নির্ভর করে এমন প্রকল্পগুলির বাক্সগুলি পরীক্ষা করুন
  5. ঠিক আছে ক্লিক করুন

নির্ভরতা নির্ধারণ করে আপনি কী বোঝাতে চাইছেন? আমি রেফারেন্স যোগ করেছি তবে এটি এখনও অভিযোগ করেছে। devblogs.microsoft.com/cppblog/cpp-testing-in-visual-studio এটিকে যথেষ্ট বলে পরামর্শ দিয়েছে।
tschmann

8

দেখা গেল আমি .cpp ফাইল সহ .c ফাইল ব্যবহার করছিলাম। .c to .cpp এর নামকরণ করা আমার সমস্যার সমাধান করে।


6

আপনি এই লিঙ্কারের ত্রুটিটি পাওয়ার অন্য একটি উপায় (যেমনটি আমি ছিলাম) হ'ল যদি আপনি কোনও dll থেকে কোনও শ্রেণীর উদাহরণ রফতানি করে থাকেন তবে সেই শ্রেণিটিকে নিজেই আমদানি / রফতানি হিসাবে ঘোষণা করেন না।

 #ifdef  MYDLL_EXPORTS 
    #define DLLEXPORT __declspec(dllexport)  
 #else
    #define DLLEXPORT __declspec(dllimport)  
 #endif

class DLLEXPORT Book // <--- this class must also be declared as export/import
{
public: 
    Book();
    ~Book();
    int WordCount();
};

DLLEXPORT extern Book book; // <-- This is what I really wanted, to export book object

সুতরাং যদিও প্রাথমিকভাবে আমি উপরে বর্ণিত বুক ক্লাসের একটি উদাহরণ রফতানি bookকরছিলাম, তখন আমাকে Bookক্লাসটি রফতানি / আমদানি শ্রেণি হিসাবে ঘোষণা করতে book.WordCount()হয়েছিল অন্যথায় অন্য ডিএলে কল করার ফলে একটি লিঙ্ক ত্রুটি হয়েছিল।


3

এটি আমার সাথে ঘটেছিল তাই আমি ভেবেছিলাম আমি আমার সমাধানটি ভাগ করে নিই, যতটা সহজ:

কনফিগারেশন বৈশিষ্ট্য -> সাধারণ -> অক্ষর সেট উভয় প্রকল্পের অক্ষর সেট পরীক্ষা করুন

আমার ইউনিটটেষ্ট প্রকল্পটি ইউনিকোডে যেখানে ছিল আমার লিবসের সময় ডিফল্ট ক্যারেক্টার সেট মাল্টি-বাইট ব্যবহার করছিল । আমার ফাংশন টিসিএইচআরিকে প্যারামিটার হিসাবে ব্যবহার করছিল । আমার liberal এর সংক্ষিপ্ত রূপ মধ্যে ফলস্বরূপ আমার TCHAR ছিল রুপান্তরিত একটি মধ্যে WCHAR কিন্তু এটি একটি ছিল গৃহস্থালি * আমার UnitTest করুন: কারণ পরামিতি সত্যিই শেষ একই ছিল না প্রতীক আলাদা ছিল।


1

আমি সবেমাত্র আবিষ্কার করেছি যে LNK2019ভিজ্যুয়াল স্টুডিও 2015 সংকলনের সময় ঘটে যদি কোনও শ্রেণীর ভিতরে ঘোষিত ফাংশনটির জন্য একটি সংজ্ঞা প্রদান করতে ভুলে যান।

লিঙ্কারের ত্রুটিটি অত্যন্ত গুপ্ত ছিল তবে আমি ত্রুটিটি পড়ে কী অনুপস্থিত তা সংকুচিত করে ক্লাসের বাইরে সংজ্ঞাটি দিয়েছি এটি পরিষ্কার করতে clear


কিছু ক্ষেত্রে সমস্যাটি হ'ল শ্রেণি ডিএফ সমন্বিত শিরোনামগুলি সমস্ত সুন্দরভাবে উল্লেখ / অন্তর্ভুক্ত থাকে তবে তাদের সম্পর্কিত সিপিএস লিঙ্কারের কাছে উপলভ্য নাও হতে পারে । সলিউশন এক্সপ্লোরারে প্রকল্পের বাহ্যিক নির্ভরতাগুলির মধ্যে চিকিত্সার সর্বোত্তম উপায়। ত্রুটি সম্পর্কিত যদিও কোনও ধরণের ফাইল অস্তিত্ব / অন্তর্ভুক্তির সতর্কতা জারি করা ভিএসের পক্ষে উপকারী হবে।
লরি স্টারন

1

আমার ক্ষেত্রে, সিপিপি ফাইলটি সম্পত্তিতে "সি / সি ++ সংকলক" এ সেট করুন -> সাধারণভাবে LNK2019 ত্রুটি সমাধান করুন।


0

আমার জন্য কাজ করে, আমি যদি এই লাইন নিচে যোগ .vcxprojমধ্যে itemGroupCPP ফাইল যা হেডার ফাইলে সংযুক্ত করা হয়।

<ClCompile Include="file.cpp" />

0

ভিজ্যুয়াল স্টুডিও 2017-এ আপনি যদি জনসাধারণের সদস্যদের পরীক্ষা করতে চান, কেবল আপনার আসল প্রকল্প এবং পরীক্ষা প্রকল্পটি একই সমাধানে রাখুন এবং পরীক্ষা প্রকল্পে আপনার বাস্তব প্রকল্পের জন্য একটি রেফারেন্স যুক্ত করুন।

দেখুন ভিসুয়াল স্টুডিও মধ্যে সি ++ ইউনিট টেস্টিং থেকে দুটিই MSDN আরো বিস্তারিত জানার জন্য ব্লগ। আপনি ভিজ্যুয়াল স্টুডিওতে সি / সি ++ এর জন্য ইউনিট পরীক্ষা লেখার পাশাপাশি ভিজ্যুয়াল স্টুডিওতে সি ++ এর জন্য মাইক্রোসফ্ট ইউনিট টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করতে পারেন করতে পারেন, যদি আপনাকে অ-জন সদস্যদের পরীক্ষা করতে হয় এবং একই প্রকল্পে পরীক্ষা করা প্রয়োজন হয় তবে আপনার আসল কোড হিসাবে

মনে রাখবেন যে আপনি যা পরীক্ষা করতে চান সেগুলি ব্যবহার করে রফতানি করতে হবে __declspec(dllexport)। আরও তথ্যের জন্য __declspec (dllexport) ব্যবহার করে একটি ডিএলএল থেকে রফতানি দেখুন ।

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