0

Normally these sort of errors means that there is a mismatch between function declaration and their bodies. I have checked that all the classes has exact number of function implementation as defined in their .h respective classes. All projects in same solution and on same platform (x86). I think this is not duplicate question as I tried to read all of the questions on forum related to this problem.

I have an MFC Project which work fine on its own. I added a class named MathFuncs.cpp with header file so that I can use that in Wrapper Class. I want to use Wrapper class in my C# project.

I have tried many different ways to develop the wrapper class project, MFC DLL, Normal Class Library and Win32 MFC Dynamically Linked Libraries. I have changed different settings too like adding dependency project, including external directories but no use. I keep on getting LNK 2028, 2019 and 1120 Error.

If I don't give reference of other class object in MathFuncs.cpp then every thing works fine but as soon as I start creating other classes (in same project) objects and using their functions the CLR (DLL) project gets upset with it. I am not sure where I am wrong. Please note that both projects are in same solution of VS2010.

Following is the Code of MathFuncs.h:

#pragma once

#include <stdexcept>
#include "ESCppClientDlg.h"
using namespace std;

class MyMathFuncs 
{
public:
    MyMathFuncs();
   double Add(double a, double b);
   double Subtract(double a, double b);
   double Multiply(double a, double b);
   double Divide(double a, double b);
   //char *getResultValue();
//private:
//  CESCppClientDlg dlg;
};

and Mathfuns.h

    #pragma once
#include "MathFuncs.h"

double MyMathFuncs::Add(double a, double b)
{ return a+b; }

double MyMathFuncs::Subtract(double a, double b)
{ return a-b; }

double MyMathFuncs::Multiply(double a, double b)
{ return a*b; }

double MyMathFuncs::Divide(double a, double b)
{
    if ( b == 0 )
       throw invalid_argument("b cannot be zero!");
    return a/b;
}
//char * MyMathFuncs::getResultValue()
//  {
//      
//
//      return dlg.GetResultValue();    
//  }

MyMathFuncs::MyMathFuncs()
{
    CWnd *pParent = (CWnd *)0;
    CESCppClientDlg dlg = new CESCppClientDlg();    
}

Following is the code of Class Library

// ClassLibrary1.h

#pragma once

#include "Stdafx.h";
#include "C:\Programming\C#\LiecaClientLibrary\ESCppClient Solution 13082015 - V2\MathFuncs.h"
#include "C:\Programming\C#\LiecaClientLibrary\ESCppClient Solution 13082015 - V2\MathFuncs.cpp"

using namespace System;

namespace CppWrapper {
    public ref class MyMathFuncsWrapper
    {
    public:
       // constructor


       MyMathFuncsWrapper()
        { 
            initVal = 20.0; 
            myCppClass = new MyMathFuncs(); //initiate C++ class's instance
        }

        double AddWrapper ( double a, double b)
        {   return myCppClass->Add(a,b);   }

        double SubtractWrapper (double a, double b)
        {   return myCppClass->Subtract(a,b);   }

        double MultiplyWrapper (double a, double b)
        {   return myCppClass->Multiply(a,b);   }

        double DivideWrapper (double a, double b)
        {   return myCppClass->Divide(a,b);   }

       // public variable
       double initVal;

        private:
           MyMathFuncs *myCppClass; // an instance of class in C++
    };

}

If I comment

CWnd *pParent = (CWnd *)0;
    CESCppClientDlg dlg = new CESCppClientDlg();

from MathFuncs.cpp then everything works fine but I really need to use CESCppClientDlg's object to access the data. That was the whole point to make wrapper class. Following is the Error I am getting:

Error 1 error LNK2028: unresolved token (0A000613) "public: __thiscall CESCppClientDlg::CESCppClientDlg(class CWnd *)" (??0CESCppClientDlg@@$$FQAE@PAVCWnd@@@Z) referenced in function "public: __thiscall MyMathFuncs::MyMathFuncs(void)" (??0MyMathFuncs@@$$FQAE@XZ) C:\Programming\C#\LiecaClientLibrary\ESCppClient Solution 13082015 - V2\ClassLibrary1\ClassLibrary1.obj ClassLibrary1 Error 2 error LNK2019: unresolved external symbol "public: __thiscall CESCppClientDlg::CESCppClientDlg(class CWnd *)" (??0CESCppClientDlg@@$$FQAE@PAVCWnd@@@Z) referenced in function "public: __thiscall MyMathFuncs::MyMathFuncs(void)" (??0MyMathFuncs@@$$FQAE@XZ) C:\Programming\C#\LiecaClientLibrary\ESCppClient Solution 13082015 - V2\ClassLibrary1\ClassLibrary1.obj ClassLibrary1 Error 3 error LNK1120: 2 unresolved externals C:\Programming\C#\LiecaClientLibrary\ESCppClient Solution 13082015 - V2\Debug\ClassLibrary1.dll ClassLibrary1

Many Thanks in Advance

  • Post the **exact** linker error messages. And show the linker command line. – Hans Passant Aug 17 '15 at 17:57
  • Thanks Hans Passant I have posted the Error too – user3585570 Aug 17 '15 at 17:59
  • Please don't think I have not defined the constructor of CESCppClientDlg. It is already defined in the class and declared in header file too. – user3585570 Aug 17 '15 at 18:01
  • The problem has been resolved now. We have to include all relevant CPP and header files as well. In my case I was including ESCppClientDlg.h in the MathFuncs.h and thought I don't need to include it into the ClassLibrary. Now after including ESCppClientDlg.h and ESCppClientDlg.cpp along with adding the project into the classLibrary Project dependency too resolved the issue for now. :) – user3585570 Aug 18 '15 at 14:55
  • But I can't find the answer in the post which thought to be duplicated http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix – user3585570 Aug 18 '15 at 14:57

0 Answers0