У меня есть следующие четыре файла a.hpp , b.hpp , b.cpp и main.cpp в Ubuntu 16.04LTS, которые имитируют мои оригинальные файлы.
a.hpp
#ifndef A_H
#define A_H
#include <iostream>
namespace Utility{
typedef struct _structure{
int v;
int w;
}aStructure;
void foo(){
std::cout << "foo" << std::endl;
}
void goo(){
foo();
}
}
#endif
b.hpp
#ifndef B_H
#define B_H
#include <iostream>
#include "a.hpp"
class bCls{
private:
int x;
public:
void moo(Utility::aStructure s);
};
#endif
b.cpp
#include <iostream>
#include "a.hpp"
#include "b.hpp"
void bCls::moo(Utility::aStructure s){
std::cout << "moo" << std::endl;
}
main.cpp
#include <iostream>
#include "a.hpp"
#include "b.hpp"
int main(){
Utility::aStructure s;
bCls u;
u.moo(s);
return 0;
}
Когда я пытаюсь скомпилировать, используя g ++ -std = c ++ 11 b.cpp main.cpp , выдается следующее сообщение об ошибке:
/tmp/ccwvPrRr.o: In function `Utility::foo()':
main.cpp:(.text+0x0): multiple definition of `Utility::foo()'
/tmp/ccCVJOoH.o:b.cpp:(.text+0x0): first defined here
/tmp/ccwvPrRr.o: In function `Utility::goo()':
main.cpp:(.text+0x23): multiple definition of `Utility::goo()'
/tmp/ccCVJOoH.o:b.cpp:(.text+0x23): first defined here
collect2: error: ld returned 1 exit status
Мой поиск привел к Почему я получаю многократную ошибку определения, когда включен заголовок? . Но одно отличие в моем коде состоит в том, что a.hpp требуется в каждом из b.hpp , b.cpp и main.cpp .
Мне очень любопытно узнать, что я делаю неправильно, и лучший подход к коду в этом случае и соответствующие подводные камни.