Я пытаюсь объявить два класса С1 а также С2 в файлах nstest1.h а также nstest2.h которые определены в файлах nstest1.cpp а также nstest2.cpp соответственно. Оба класса определены в одном и том же пространстве имен.
Ниже приведены файлы:
//nstest1.h
namespace Mine{
class C1{
public:
void callme();
};
}
//nstest2.h
namespace Mine {
class C2 {
public:
void callme();
};
}
//nstest1.cpp
#include<iostream>
#include "nstest1.h"
using namespace std;
using namespace Mine;
void Mine::C1::callme(){
std::cout << "Please call me " << std::endl;
}
//nstest2.cpp
#include<iostream>
#include "nstest2.h"
using namespace std;
using namespace Mine;
void Mine::C2::callme(){
std::cout << "Please call me too" << std::endl ;
}
Следующий файл пытается использовать эти классы, используя пространство имен Мой.
//nstest.cpp
#include<iostream>
#include "nstest1.h"#include "nstest2.h"
using namespace std;
using namespace Mine;
int main(){
Mine::C1 c1;
Mine::C2 c2;
c1.callme();
c2.callme();
return 0;
}
Когда я компилирую с помощью команды «g ++ nstest.cpp», я получаю следующую ошибку:
/tmp/cc2y4zc6.o: In function `main':
nstest.cpp:(.text+0x10): undefined reference to `Mine::C1::callme()'
nstest.cpp:(.text+0x1c): undefined reference to `Mine::C2::callme()'
collect2: error: ld returned 1 exit status
Если определения перемещаются в файлы объявлений (nstest1.h и nstest2.h), все работает нормально. Не уверен, что здесь происходит. Я что-то пропустил ?
Заранее спасибо 🙂 .
Вы должны включить другие .cpp файлы при сборке программы.
Вариант 1. Скомпилируйте все файлы и соберите исполняемый файл одной командой.
g++ nstest.cpp nstest1.cpp nstest2.cpp -o nstest
Вариант 2: скомпилируйте каждый файл отдельно, а затем соберите исполняемый файл
g++ -c nstext1.cpp
g++ -c nstest2.cpp
g++ -c nstest.cpp
g++ nstest.o nstest1.o nstext2.o -o nstest
Ваша проблема возникает во время ссылки. Ваши заголовки в порядке. Но вы должны также скомпилировать другие файлы cpp.