как связать заголовочные файлы в C ++ - PullRequest
5 голосов
/ 27 сентября 2010

Я новичок в программировании на C ++ с заголовочными файлами.Это мой текущий код:

//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;  
}

Когда я пытаюсь скомпилировать его с g++ ex2.cpp, я получаю эту ошибку:

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

Почему это не работает, и как можноЯ это исправлю?

Ответы [ 4 ]

28 голосов
/ 27 сентября 2010

Вы не связываете заголовочные файлы. Вы связываете объектные файлы , которые создаются путем компиляции .cpp файлов. Вам необходимо скомпилировать все ваши исходные файлы и передать полученные объектные файлы компоновщику.

Из сообщения об ошибке кажется, что вы используете GCC. Если это так, я думаю, что вы можете сделать
g++ ex2.cpp a.cpp
чтобы он скомпилировал оба .cpp файла и вызвал компоновщик с результирующими объектными файлами.

8 голосов
/ 27 сентября 2010

Вам необходимо скомпилировать и связать оба исходных файла, например:

g++ ex2.cpp a.cpp -o my_program
3 голосов
/ 27 сентября 2010

Вам необходимо скомпилировать и затем связать оба исходных (.cpp) файла:

g++ -Wall -pedantic -g -o your_exe a.cpp ex2.cpp
2 голосов
/ 27 сентября 2010

В настоящее время вы компилируете и связываете только ex2.cpp, но этот файл использует класс def и вызовы функций, присутствующие в a.cpp, поэтому вам нужно скомпилировать и связать a.cpp, а также:

g++ ex2.cpp a.cpp

Приведенная выше команда скомпилирует исходный файл (.cpp) в объектные файлы и свяжет их, чтобы получить исполняемый файл a.out.

...