siri
siri

Reputation: 161

how to link header files in c++

I'm new to programming in C++ with header files. This is my current code:

//a.h
#ifndef a_H
#define a_H
namespace hello
{
  class A
  {
    int a;
    public:
      void setA(int x);
      int getA();
  };
} 
#endif

//a.cpp
#include "a.h"
namespace hello
{
   A::setA(int x)
  {
    a=x;
  }
  int A::getA()
  {
    return a;
  }
}

//ex2.cpp
#include "a.h"
#include<iostream>
using namespace std;

namespace hello
{
  A* a1;
}
using namespace hello;
int main()
{
  a1=new A();
  a1->setA(10);
  cout<<a1->getA();
  return 1;  
}

When I try to compile it with g++ ex2.cpp, I get this error:

In function `main':
ex2.cpp:(.text+0x33): undefined reference to `hello::A::setA(int)'
ex2.cpp:(.text+0x40): undefined reference to `hello::A::getA()'
collect2: ld returned 1 exit status

Why isn't it working, and how can I fix it?

Upvotes: 16

Views: 55635

Answers (4)

codaddict
codaddict

Reputation: 455400

Currently you are compiling and linking only ex2.cpp but this file has makes use of class def and function calls present in a.cpp so you need to compile and link a.cpp as well as:

g++ ex2.cpp a.cpp

The above command will compile the source file(.cpp) into object files and link them to give you the a.out executable.

Upvotes: 5

Nikolai Fetissov
Nikolai Fetissov

Reputation: 84239

You need to compile and then link both source (.cpp) files:

g++ -Wall -pedantic -g -o your_exe a.cpp ex2.cpp

Upvotes: 5

Oliver Charlesworth
Oliver Charlesworth

Reputation: 272752

You need to compile and link both source files, e.g.:

g++ ex2.cpp a.cpp -o my_program

Upvotes: 11

sbi
sbi

Reputation: 224179

You don't link header files. You link object files, which are created by compiling .cpp files. You need to compile all your source files and pass the resulting object files to the linker.

From the error message it seems you're using GCC. If so, I think you can do
g++ ex2.cpp a.cpp
to have it compile both .cpp files and invoke the linker with the resulting object files.

Upvotes: 37

Related Questions