Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема связывания в Qt
Форум на CrossPlatform.RU > Разработка > С\С++
denis_panchenko
Объясню суть проблемы на примере.
Имеется 3 файла:
1) a.h
//----------------------
#ifndef a_h
#define a_h

namespace ns
{
    void foo(){};
}
#endif
//---------------------

2) b.h
//---------------------
#ifndef b_h
#define b_h

#include "a.h"

#endif
//---------------------

3) c.h
//---------------------
#ifndef c_h
#define c_h

#include "b.h"

#endif

При таком положении дел все компилируется и работает, но стоит добавить файл
b.cpp
//----------------------
#include "b.h"
//----------------------


как линкер выдаёт ошибку: a.h:6: multiple definition of `ns::foo()'.
Не понимаю чем вызвана эта ошибка и как в данном случае с ней справиться? Задаю вопрос в разделе про Qt, так как это упрощенная модель структуры программы, которая создаётся в Qt Creator 4.6.2
Litkevich Yuriy
Цитата(denis_panchenko @ 28.8.2011, 21:26) *
Задаю вопрос в разделе про Qt, так как это упрощенная модель структуры программы, которая создаётся в Qt Creator 4.6.2
это не повод. Ошибка линкера не связана с Qt.
Цитата(denis_panchenko @ 28.8.2011, 21:26) *
ак линкер выдаёт ошибку: a.h:6: multiple definition of `ns::foo()'.
линкер пишет ещё одну строку, в которой указывает, где в первые встречается объявление.
denis_panchenko
Qt Creator выдает следующие три сообщения:

a.h:3: multiple definition of `foo()'
a.h:3: first defined here
error: collect2: ld returned 1 exit status

Никак не могу понять, почему он говорит, о двойном объявлении функции...
Litkevich Yuriy
Хех, что-то я сразу не заметил. У тебя в заголовочнике описана, а не просто объявлена функция, она попадает в файл b.cpp и куда-то ещё (в cpp-файл).

чтобы понять, нарисуй на бумаге какой файл в какой включается и так для каждого cpp-файла.
Гость
Проверьте файл проекта *.pro там файлы могут дублироваться
ssoft
Цитата(denis_panchenko @ 28.8.2011, 19:26) *
Объясню суть проблемы на примере.
Имеется 3 файла:
1) a.h
//----------------------
#ifndef a_h
#define a_h

namespace ns
{
void foo(){};
}
#endif
//---------------------

2) b.h
//---------------------
#ifndef b_h
#define b_h

#include "a.h"

#endif
//---------------------

3) c.h
//---------------------
#ifndef c_h
#define c_h

#include "b.h"

#endif

При таком положении дел все компилируется и работает, но стоит добавить файл
b.cpp
//----------------------
#include "b.h"
//----------------------

как линкер выдаёт ошибку: a.h:6: multiple definition of `ns::foo()'.
Не понимаю чем вызвана эта ошибка и как в данном случае с ней справиться? Задаю вопрос в разделе про Qt, так как это упрощенная модель структуры программы, которая создаётся в Qt Creator 4.6.2


Все правильно, т.к. здесь представлена реализация не inline метода в заголовочном файле.

Так должно работать

namespace ns
{
    inline void foo(){};
}
Алексей1153
попробуй так

в заголовке:

namespace ns
{
   extern void foo();
}


в реализации

namespace 
{
   void foo()
  {
  }
}
ssoft
Так тоже будет работать )))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.