Работая с Fedora G ++, я заметил кое-что раздражающее для меня. Я думаю, что неправильно понимает поведение g ++ с именами и заголовочными файлами.
Вы увидите 2 версии очень простого класса и основную функцию.
- Первый полностью встраивается в один файл с именем "mainfull. cpp" и компилируется без вывода сообщений.
- Второй - это тот же код, распространяемый в трех файлах "MaClass.hpp" , "MaClass. cpp" и "main. cpp". Проблема возникает из этой версии.
$ g++ -o doit MaClass.cpp main.cpp
/usr/bin/ld : /tmp/cc9IOJE8.o : in function « main » :
main.cpp:(.text+0x10) : undefined reference to « test::example::MaClass::doit() »
collect2: error: ld returned exit status 1
Но ошибка исчезает при подавлении пространства имен или при изменении включения из заголовочного файла в файл реализации. Вот мои вопросы:
- Как правильно включать многофайловые классы с пространствами имен?
- Как в этом случае использовать g ++?
Но я болтун; вот код:
mainfull. cpp: нет pb при компиляции с: g ++ -o mainfull mainfull. cpp
#include <iostream>
namespace test {
namespace example {
class MaClass {
public:
void doit();
};
}
}
int main() {
test::example::MaClass c;
c.doit();
return 0;
}
namespace test {
namespace example {
void MaClass::doit() {
::std::cout << "I did it !" << ::std::endl;
}
}
}
А вот версия на ведьму я получаю сомнения: (все остальные файлы) MaClass.hpp
#ifndef MACLASS
#define MACLASS
#include <iostream>
namespace test {
namespace example {
class MaClass {
public:
void doit();
};
}
}
#endif
MaClass. cpp
#include "MaClass.hpp"
namespace test {
namespace example {
void MaClass::doit() {
::std::cout << "I did it !" << ::std::endl;
}
}
}
main. cpp
#include "MaClass.hpp"
int main() {
test::example::MaClass c;
c.doit();
return 0;
}
Проблема возникает с:
g++ -o doit MaClass.cpp main.cpp -std=c++11
Я не знаю причину этого. Я знаю, что проблема исходит от меня, а не от Fedora. Любая помощь будет оценена. У меня нет проблем на Visual Studio 2019 ни с той, ни с другой версией; все автоматизировано c, я должен был что-то пропустить.