?
Solved

How to resolve externals ?

Posted on 2002-05-07
6
Medium Priority
?
223 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 

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 400 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

Industry Leaders: 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!

Question has a verified solution.

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

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
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 viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.
Suggested Courses

800 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