2013-11-10 4 views
53

मुझे यह त्रुटि मिलती है, लेकिन मुझे नहीं पता कि इसे कैसे ठीक किया जाए।त्रुटि को हल करने के लिए कैसे करें LNK2019: अनसुलझा बाहरी प्रतीक - समारोह?

मैं दृश्य स्टूडियो 2013 का उपयोग कर रहा मैं समाधान नाम MyProjectTest यह मेरा परीक्षण समाधान की संरचना है बनाया:

The structure

- function.h

#ifndef MY_FUNCTION_H 
#define MY_FUNCTION_H 

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

-function.cpp

#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; 
} 

मैं अभी शुरुआत कर रहा हूँ; यह एक साधारण कार्यक्रम है और यह बिना त्रुटि के चलता है। मैं इंटरनेट में पढ़ सकते हैं और इकाई परीक्षण में रुचि हो गया, तो मैं एक परीक्षण प्रोजेक्ट बनाया:

फ़ाइल> नया> परियोजना ...> स्थापित> टेम्पलेट> विजुअल C++> टेस्ट> मूल निवासी यूनिट टेस्ट परियोजना>

नाम: UnitTest1 समाधान: समाधान तब में जोड़े स्थान वर्तमान खुली समाधान के रास्ते पर स्वत: बंद कर यह समाधान की फ़ोल्डर संरचना है:

Folder structure

मैं केवल फ़ाइल unittest1.cpp संपादित:

#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 मिलती है: अनसुलझे बाह्य प्रतीक। मुझे पता है कि फ़ंक्शन एकाधिक कार्यान्वयन गुम है। मैंने function.cpp फ़ाइल को हटाने का प्रयास किया और मैंने घोषणा को परिभाषा के साथ बदल दिया, और यह चला गया। लेकिन एक ही फाइल में घोषणा और परिभाषा दोनों लिखना अनुशंसित नहीं है। मैं ऐसा करने के बिना इस त्रुटि को कैसे ठीक कर सकता हूं? क्या मुझे फ़ाइल unittest.cpp में #include "../MyProjectTest/function.cpp" के साथ प्रतिस्थापित करना चाहिए? (। मैं अंग्रेजी में अच्छा नहीं कर रहा हूँ बहुत बहुत धन्यवाद)

+0

संभावित डुप्लिकेट [एक अनिर्धारित संदर्भ/अनसुलझा बाहरी प्रतीक त्रुटि क्या है और मैं इसे कैसे ठीक कर सकता हूं?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- बाहरी-प्रतीक-त्रुटि-और-कैसे-करें-i-fix) – WhozCraig

+3

** BE CAREFUL ** एक * विंडोज * वातावरण में, स्थिर पुस्तकालयों में '.LIB' फ़ाइल एक्सटेंशन होता है। चीजों को जटिल बनाने के लिए ... गतिशील लिंक पुस्तकालय (यानी '* डीएलएल') में एक साथ * आयात लाइब्रेरी हो सकती है * जिसमें' .LIB' फ़ाइल एक्सटेंशन भी हो। यह आयात पुस्तकालय '* डीएलएल' द्वारा प्रदान की गई सभी उपहारों को सूचीबद्ध करता है। अधिक जानकारी के लिए, कृपया पढ़ें: [शुरुआती गाइड टू लिंकर्स] (http://www.lurklurk.org/linkers/linkers.html) – Pressacco

+0

उसे सावधान क्यों होना चाहिए ?? –

उत्तर

46

एक विकल्प आपके UnitTest1 प्रोजेक्ट में function.cpp शामिल करना होगा, लेकिन यह सबसे आदर्श समाधान संरचना नहीं हो सकता है। आपकी समस्या का संक्षिप्त उत्तर यह है कि जब आप UnitTest1 प्रोजेक्ट का निर्माण करते हैं, तो कंपाइलर और लिंकर को पता नहीं है कि function.cpp मौजूद है, और इसमें लिंक करने के लिए कुछ भी नहीं है जिसमें multiple की परिभाषा शामिल है। इसे ठीक करने का एक तरीका पुस्तकालयों को जोड़ने का उपयोग कर रहा है।

के बाद से अपने इकाई परीक्षण एक अलग परियोजना में हैं, मैं अपने इरादे संभालने रहा है कि परियोजना एक स्टैंडअलोन इकाई-परीक्षण कार्यक्रम बनाना है।उन कार्यों के साथ जिन्हें आप किसी अन्य प्रोजेक्ट में स्थित परीक्षण कर रहे हैं, उस परियोजना को या तो गतिशील या स्थैतिक रूप से लिंक की गई लाइब्रेरी में बनाना संभव है। स्टेटिक पुस्तकालयों का निर्माण समय में अन्य कार्यक्रमों से जुड़े होते हैं, और विस्तार .lib है, और गतिशील पुस्तकालयों कार्यावधि में जुड़े हुए हैं, और विस्तार .dll है। मेरे उत्तर के लिए मैं स्थिर पुस्तकालयों को पसंद करूंगा।

आप परियोजनाओं गुण में उसे बदल कर एक स्थिर पुस्तकालय में अपना पहला कार्यक्रम बदल सकते हैं। सामान्य टैब के तहत एक विकल्प होना चाहिए जहां परियोजना निष्पादन योग्य (.exe) पर निर्माण करने के लिए सेट की गई है। आप इसे .lib में बदल सकते हैं। .lib फ़ाइल .exe रूप में एक ही जगह पर निर्माण होगा।

अपने UnitTest1 प्रोजेक्ट में, आप अपनी संपत्तियों पर जा सकते हैं, और श्रेणी में अतिरिक्त लाइब्रेरी निर्देशिकाओं में लिंकर टैब के तहत, MyProjectTest बनाता है। फिर, लिंकर के तहत अतिरिक्त निर्भरता के लिए - इनपुट टैब, नाम अपने स्थिर पुस्तकालय की सबसे अधिक संभावना MyProjectTest.lib जोड़ें।

कि अपनी परियोजना के निर्माण के लिए अनुमति चाहिए। ध्यान दें कि ऐसा करके, MyProjectTest एक स्टैंडअलोन निष्पादन योग्य कार्यक्रम जब तक आप जरूरत के मुताबिक इसके निर्माण गुणों को बदलने, जो आदर्श से कम हो जाएगा नहीं होगा।

30

दृश्य स्टूडियो समाधान ट्री में सही परियोजना 'UnitTest1' पर क्लिक करें और फिर जोड़ें -> फ़ाइल ../MyProjectTest/function चुनें -> मौजूदा आइटम .cpp

9

चूंकि मैं चाहता हूं कि मेरी परियोजना एक स्टैंडअलोन EXE को संकलित करे, मैंने यूनिटटेस्ट प्रोजेक्ट को function.cob से उत्पन्न function.obj फ़ाइल से जोड़ा और यह काम करता है। 'UnitTest1' परियोजना पर राइट क्लिक करें> विन्यास गुण> लिंकर> इनपुट> अतिरिक्त निर्भरता> जोड़ें ".. \ MyProjectTest \ डीबग \ function.obj"

6

मैं सिर्फ जाहिर है अब विजुअल स्टूडियो 2013 में इस समस्या का सामना किया , एक ही समाधान में दो परियोजनाएं और निर्भरताओं को स्थापित करना पर्याप्त नहीं है। आपको उनके बीच एक परियोजना संदर्भ जोड़ने की जरूरत है। ऐसा करने के लिए:

  1. समाधान में परियोजना पर राइट क्लिक करें
  2. जोड़ें क्लिक करें => संदर्भ का पता लगाने ...
  3. जोड़े नए संदर्भ बटन
  4. क्लिक परियोजनाओं के लिए बॉक्स को चेक करें कि इस परियोजना पर ठीक
  5. क्लिक करें निर्भर करता है
6

यह पता चला मैं सीपीपी फाइलों के साथ फ़ाइलें ग उपयोग कर रहा था। .cpp को .cpp का नाम बदलकर मेरी समस्या हल हो गई।

0

मेरे लिए काम करता है, अगर मैं itemGroup cpp फ़ाइल है, जो फ़ाइल शीर्षक से जुड़ा है में .vcxproj में इस लाइन bellow जोड़ें।

<ClCompile Include="file.cpp" /> 
1

एक और तरीका है कि आप इस लिंकर त्रुटि प्राप्त कर सकते हैं (जैसा कि मैंने था) यदि आप एक 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 बुलाया बुक वर्ग के सिर्फ एक उदाहरण निर्यात किया गया था, हालांकि, मैं भी अन्यथा अन्य dll में book.WordCount() बुला निर्यात/आयात वर्ग के रूप में Book वर्ग घोषित करने के लिए किया था पैदा कर रहा था एक लिंक त्रुटि।

0

मुझे पता चला कि LNK2019 विजुअल स्टूडियो 2015 में संकलन के दौरान होता है यदि कक्षा के भीतर घोषित फ़ंक्शन की परिभाषा प्रदान करना भूल जाता है।

लिंकर त्रुटि बहुत ही गुप्त थी लेकिन मैंने त्रुटि को पढ़ने के द्वारा क्या खोया था और मैंने इसे साफ़ करने के लिए कक्षा के बाहर परिभाषा प्रदान की।

0

यह मुझे क्या हुआ तो मैं के रूप में यह था कि मैं अपने समाधान का हिस्सा हो सकता है सोचा, सरल रूप में:

विन्यास गुण में दोनों परियोजनाओं के वर्ण सेट की जाँच करें ->जनरल ->अक्षर समूह

मेरे unittest परियोजना डिफ़ॉल्ट चरित्र बहु बाइट सेट जबकि मेरी libs जहां में यूनिकोड उपयोग कर रहा था।
मेरा फ़ंक्शन पैरामीटर के रूप में TCHAR का उपयोग कर रहा था। मेरी lib मेरी TCHAR में एक परिणाम के रूप एक WCHAR में तब्दील था लेकिन यह मेरी unittest पर एक चार * था: क्योंकि मापदंडों वास्तव में अंत में एक ही नहीं थे प्रतीक भिन्न थे।

संबंधित मुद्दे