crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
denis_panchenko
  опции профиля:
сообщение 28.8.2011, 18:26
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 28.8.2011
Пользователь №: 2834

Спасибо сказали: 0 раз(а)




Репутация:   0  


Объясню суть проблемы на примере.
Имеется 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

Сообщение отредактировал ViGOur - 1.11.2011, 20:03
Причина редактирования: Добавил тэги CODE
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.8.2011, 18:30
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
  опции профиля:
сообщение 28.8.2011, 18:55
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 28.8.2011
Пользователь №: 2834

Спасибо сказали: 0 раз(а)




Репутация:   0  


Qt Creator выдает следующие три сообщения:

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

Никак не могу понять, почему он говорит, о двойном объявлении функции...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.8.2011, 19:23
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

чтобы понять, нарисуй на бумаге какой файл в какой включается и так для каждого cpp-файла.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 29.10.2011, 10:03
Сообщение #5





Гости








    


Проверьте файл проекта *.pro там файлы могут дублироваться
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 31.10.2011, 8:01
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(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
  опции профиля:
сообщение 31.10.2011, 8:07
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


попробуй так

в заголовке:

namespace ns
{
   extern void foo();
}


в реализации

namespace 
{
   void foo()
  {
  }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 31.10.2011, 8:25
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Так тоже будет работать )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.7.2025, 12:22