Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

How to resolve externals ?

Posted on 2002-05-07
6
Medium Priority
?
227 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 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

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
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 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.
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.
Suggested Courses

618 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