Простая многофайловая компиляция c ++ 11 g ++ при определении личного пространства имен в классах - PullRequest
0 голосов
/ 04 мая 2020

Работая с 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, я должен был что-то пропустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...