Linking problem - please help

C

Chiller

I'm in the early stages of developing a class that will represent a metric
distance by storing both a number and unit (ie KM, M, CM etc).

I've developed some initial code as a starting point; however, it won't link
during a compile using VC++.

The error message I get is "
LIBCD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main
referenced in function _mainCRTStartup

Debug/Message.exe : fatal error LNK1120: 1 unresolved externals"


I've included the header and source below. Any help would be appreciated.

Thanks


//Distance.h as follows:
********************************************
#ifndef DISTANCE_H

#define DISTANCE_H

#include <iostream>

using namespace std;

class Distance

{

public :

Distance ( int, char ) ; // constructor (takes int value and string unit of
measure

~Distance ( void ) ; // destructor (its name is ~ then class name)

//access member functions

int number (void) const;

char measure (void) const;



private :

int nu ; // the value

char me ; // the unit of measure

} ;

// provide an overload of "<<" for easy display

ostream& operator<< (ostream&, const Distance&);

#endif



//Distance.cpp as follows:

******************************************************
#include "Distance.h"

#include <iostream>

using namespace std;

/*-------------------------------------------------------*\

| implementation of member functions |

\*-------------------------------------------------------*/

// constructor

Distance :: Distance ( int n, char m ) : nu(n), me(m) {}

// access functions

int Distance :: number (void) const

{

return nu;

}

char Distance :: measure (void) const

{

return me;

}

// provide an overload of "<<" for easy display

ostream& operator<< (ostream& out, const Distance& d)

{

out << d.number() << "-" << d.measure();

return out;

}

/*-------------------------------------------------------*\

| test driver for the Distance class |

\*-------------------------------------------------------*/

#ifdef TEST_DISTANCE // .... Distance class .... test driver

int main ( void )

{

// create test input

Distance a = Distance (5, KM);

cout << a << endl;



cin ignore();

return 0; // normal termination

}

#endif
 
K

Karl Heinz Buchegger

Chiller said:
I'm in the early stages of developing a class that will represent a metric
distance by storing both a number and unit (ie KM, M, CM etc).

I've developed some initial code as a starting point; however, it won't link
during a compile using VC++.

The error message I get is "
LIBCD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main
referenced in function _mainCRTStartup

as the linker says: it cannot find a main function in what you try to link.
#ifdef TEST_DISTANCE // .... Distance class .... test driver

int main ( void )
[...]

#endif

I cannot see a definition for TEST_DISTANCE in what you have posted. Is this
definement set through some compiler options?
 
J

John Harrison

#ifdef TEST_DISTANCE // .... Distance class .... test driver

int main ( void )

{

// create test input

Distance a = Distance (5, KM);

cout << a << endl;



cin ignore();

return 0; // normal termination

}

#endif

The obvious problem seems to be that you haven't defined TEST_DISTANCE. Are
you sure you developed this code? And what do you think TEST_DISTANCE is for
anyway? I would just remove it.

john
 
C

Chiller

I was under the impression that a test driver could be included with a class
which would enable conditional compilation by wrapping the test in "#ifdef
TEST_?????" and #endif. The ????? being the name of the class in uppercase.


Karl Heinz Buchegger said:
Chiller said:
I'm in the early stages of developing a class that will represent a metric
distance by storing both a number and unit (ie KM, M, CM etc).

I've developed some initial code as a starting point; however, it won't link
during a compile using VC++.

The error message I get is "
LIBCD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main
referenced in function _mainCRTStartup

as the linker says: it cannot find a main function in what you try to link.
#ifdef TEST_DISTANCE // .... Distance class .... test driver

int main ( void )
[...]

#endif

I cannot see a definition for TEST_DISTANCE in what you have posted. Is this
definement set through some compiler options?
 
J

John Harrison

Chiller said:
I was under the impression that a test driver could be included with a class
which would enable conditional compilation by wrapping the test in "#ifdef
TEST_?????" and #endif. The ????? being the name of the class in uppercase.

Well, that's not right.

Seems you are under the impression that the C++ pre-processor is more
sophisticated than it really is. The rules are very simple, if you write

#ifdef SOMETHING

some code in here

#endif

then the code between the #ifdef and #endif will not be compiled unless
SOMETHING is defined.

That's all there is to it, test drivers and classes have no relevance.

john
 
C

Chiller

For anyone reading this thread.

As it turns out, I'm also required to declare the test driver in the
preprocessor definitions. This must avoid the requirement to declare or
undeclare the definition each time I wish to use the test driver.

To do this under VC++ it's simply a matter of going into the properties of
the project selecting the Preprocessor and adding the name of the test
driver, "TEST_DISTANCE" in this case.


Thanks for your help Karl.
 
K

Karl Heinz Buchegger

Chiller said:
For anyone reading this thread.

As it turns out, I'm also required to declare the test driver in the
preprocessor definitions. This must avoid the requirement to declare or
undeclare the definition each time I wish to use the test driver.

To do this under VC++ it's simply a matter of going into the properties of
the project selecting the Preprocessor and adding the name of the test
driver, "TEST_DISTANCE" in this case.

Thanks for your help Karl.

2 things:

* Please don't top post. Put your reply beneth the text you are replying to,
such I have done it right now.

* Again: test driver or some other high sophiticated concept has nothing
to do with it. It's simple a preprocessor macro, that's used to include
or exclude some text. That this text implements the main() function is
a coincidence. It could be anything else

#include <iostream>

#define MY_TEST

int main()
{

#ifdef MY_TEST
std::cout << "MY_TEST is defined" << std::endl;
#else
std::cout << "MY_TEST is NOT defined" << std::endl;
#endif
}

If you compile and run this program, it will output
MY_TEST is defined

If you then comment the #define line such as

#include <iostream>

// #define MY_TEST

int main()
...

it will output
MY_TEST is NOT defined

It's a simple question of what source code text gets compiled. Parts
of the source code text can be hidden by using an #ifdef preprocessor
directive. The preprocessor knows next to nothing about C or C++. All
it does is some text replacements before the actual compiler sees the
source code. That's all it does.

Most compilers also allow to #define or #undef - ine preprocessor symbols
via the command line interface, or the IDE. But in principle it is the same
thing: if the symbol is defined some text gets sent to the compiler, if it
is not, the text is hidden from the compiler. In this case. Such preprocessor
macros and symbols can be used for a number of other things. But it always
turns around: modify the source code text before the actual compiler sees it.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,043
Latest member
CannalabsCBDReview

Latest Threads

Top