Solved

How to resolve externals ?

Posted on 2002-05-07
6
222 Views
Last Modified: 2010-04-02
Here is the situation:

- point.h define a class Point and contains prototype definitions of all its methods.
- point.cpp defines all its methods.
- myProg2.cpp is a program that instantiates class Point.

I have created a DLL, point.dll as follows:
cl -GX -LD point.cpp -Fepoint.dll

I tried the following to build the binary but got link errors:

G:\C++\DLL>cl -GX myProg2.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

myProg2.cpp
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:myProg2.exe
myProg2.obj
myProg2.obj : error LNK2001: unresolved external symbol "public: __thiscall point::point(double,double)" (??0point@@QAE@NN@Z)
myProg2.exe : fatal error LNK1120: 1 unresolved externals

Question: How do I resolve the 'unresolved externals' ???

----------------- start of point.h ------------------------
// point.h
class point {
  private:
    double  x;
    double  y;
  public:
    point();
    point (double, double);
    void printPoint();
    double getX();
    double getY();
    void setX(double);
    void setY(double);
};
----------------- end of point.h ------------------------

----------------- start of point.cpp ------------------------
// point.cpp
#include <iostream>
#include "point.h"

using namespace std;

// default constructor
point::point() {
  x = 0.0;
  y = 0.0;
}

// constructor with params
point::point(double pointX, double pointY) {
  x = pointX;
  y = pointY;
}

double point::getX() {
  return x;
}

double point::getY() {
  return y;
}

void point::setX(double pX) {
  x = pX;
}

void point::setY(double pY) {
  y = pY;
}

void point::printPoint() {
  cout << "Class point: x=" << x << " y=" << y << " ";
}
----------------- end of point.cpp ------------------------

----------------- start of myProg2.cpp ------------------------
// Example2: file myProg2.cpp
#include <iostream.h>
#include "point.h"
int main()
{
  cout << "Hello, world!\n";

 // create instances of two point, p1 & p2
 point p1(4.0, 4.0), p2(5.0, 5.0);

  return 0;
}
----------------- end of myProg2.cpp ------------------------
0
Comment
Question by:rsood
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
6 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 6993756
You have to add the import library (probably 'point.lib') when linking the application - you can either do that by specifying it on the command line like

cl -GX myProg2.cpp /link point.lib

or by placing a directive in 'myProg2.cpp':

#pragma comment ( lib, "point.lib")
0
 

Author Comment

by:rsood
ID: 6993793
I tried as you sugested but got the following error:

G:\C++\DLL>cl -GX myProg2.cpp /link point.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

myProg2.cpp
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:myProg2.exe
point.lib
myProg2.obj
LINK : fatal error LNK1181: cannot open input file "point.lib"

I do not see point.lib in my directory. Is it supposed to be created when point.dll is created ?
0
 
LVL 86

Expert Comment

by:jkr
ID: 6993802
>>Is it supposed to be created when point.dll is created

Yes, it should be in the same directory as 'point.dll'. You can also specify an absolute path to the .lib file.

BTW, I just noticed a small problem with your class - it should be

// point.h

#ifdef POINT_DLL
#define __DYNLINK __declspec ( dllexport)
#else
#define __DYNLINK __declspec ( dllimport)

class __DYNLINK point { // either export or import, depending on what we are compiling
 private:
   double  x;
   double  y;
 public:
   point();
   point (double, double);
   void printPoint();
   double getX();
   double getY();
   void setX(double);
   void setY(double);
};


// point.cpp
#include <iostream>
#define POINT_DLL
#include "point.h"

If you don't export your class, you will not get a lib file.
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:rsood
ID: 6993833
Thanks for your help but I am absolute newbie and need a little more help to get this example going. (I have raised the points also.)

After modifying point.h and point.cpp, I am getting the following compilation errors:

G:\C++\DLL>cl -nologo -GX -LD point.cpp -Fepoint.dll
point.cpp
point.h(21) : fatal error C1004: unexpected end of file found

-------- start of point.h ----------
// point.h
#ifdef POINT_DLL
#define __DYNLINK __declspec ( dllexport)
#else
#define __DYNLINK __declspec ( dllimport)

// either export or import, depending on what we are compiling
class __DYNLINK point {
  private:
    double  x;
    double  y;
  public:
    point();
    point (double, double);
    void printPoint();
    double getX();
    double getY();
    void setX(double);
    void setY(double);
};
-------- end of point.h ----------

-------- start of point.cpp ----------
// point.cpp
#include <iostream>
#define POINT_DLL
#include "point.h"

using namespace std;

// default constructor
point::point() {
  x = 0.0;
  y = 0.0;
}

// constructor with params
point::point(double pointX, double pointY) {
  x = pointX;
  y = pointY;
}

double point::getX() {
  return x;
}

double point::getY() {
  return y;
}

void point::setX(double pX) {
  x = pX;
}

void point::setY(double pY) {
  y = pY;
}

void point::printPoint() {
  cout << "Class point: x=" << x << " y=" << y << " ";
}
-------- end of point.cpp ----------

0
 
LVL 86

Accepted Solution

by:
jkr earned 100 total points
ID: 6993855
Ooops, I am sorry, I forgot the '#endif' directive:

// point.h
#ifdef POINT_DLL
#define __DYNLINK __declspec ( dllexport)
#else
#define __DYNLINK __declspec ( dllimport)
#endif // <-- this one was missing...

// either export or import, depending on what we are compiling
class __DYNLINK point {
 private:
   double  x;
   double  y;
 public:
   point();
   point (double, double);
   void printPoint();
   double getX();
   double getY();
   void setX(double);
   void setY(double);
};
0
 

Author Comment

by:rsood
ID: 6993877
You are a great help ! Thanks again.
0

Featured Post

Enroll in June's Course of the Month

June's Course of the Month is now available! Every 10 seconds, a consumer gets hit with ransomware. Refresh your knowledge of ransomware best practices by enrolling in this month's complimentary course for Premium Members, Team Accounts, and Qualified Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question