Я много читал о связывании ошибок здесь в stackoverflow, но я не знаю, где моя проблема.
main.cpp
#include "traffic.h"using namespace std;
int main(){
traffic t();
...
}
traffic.h
#ifndef _TRAFFIC
#define _TRAFFIC
#include "gnuplot.h"
using namespace std;
class traffic{
public:
int step;
Gnuplot gpl;
...
#endif
После того, как я сделал .o файлы, я хотел связать их все. Следующая ошибка происходит.
ракушка
g++ -o tr traffic.o main.o
main.o:(.bss+0x0): multiple definition of `Gnuplot::tmpfile_num'
traffic.o:(.bss+0x0): first defined here
и много других ошибок определения, касающихся Gnuplot.
gnuplot используется только в traffic.cpp
Мой вопрос: где моя ошибка?
Кстати: слишком мало информации, чтобы решить проблему?
Это прямо из gnuplot.h заголовок
//------------------------------------------------------------------------------
//
// initialize static data
//
int Gnuplot::tmpfile_num = 0;
Кажется плохой практикой инициализации статики в заголовочном файле, когда их следует выполнять только в файлах cpp, чтобы избежать дублирования определений.
В вашем случае вы можете исправить это, не включая gnuplot.h заголовок в любом из ваших заголовочных файлов, но только в файле cpp. Это повлечет за собой оборачивание всех вызовов функций заголовка gnuplot через оболочку, поскольку она не будет доступна ни в одном cpp, но в одном
использование #include "gnuplot.h"
в файле cpp вместо header
файл означает .h
файл
тогда ваши файлы будут скомпилированы