Solved

How to resolve externals ?

Posted on 2002-05-07
6
220 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
  • 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
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
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…
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 learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

856 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