2010-09-27 3 views
5

Я новичок в программировании на C++ с заголовочными файлами. Это мой текущий код:Как связать файлы заголовков в 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 

Почему это не работает, и как я могу это исправить?

+0

Пожалуйста, используйте исходный код форматирования, щелкните значок «101 010» в редакторе. – mikerobi

+1

Вы забыли 'void' перед' A :: setA' в вашем файле a.cpp. –

ответ

2

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

g++ ex2.cpp a.cpp 

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

23

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

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

+8

+1 для 'Вы не связываете файлы заголовков'. :) –

8

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

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

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

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

Могу ли я также предложить «-Werror» :)? –

Смежные вопросы