Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> multiple definition 
V
    Опции темы
kuvshinka
Дата 23.9.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Код

mainwindow.cpp
#include "mainwindow.h"
#include "module1.cpp"
…

mainwindow.h
#include "unit2.h"
class Unit2;
…

unit2.cpp
#include "unit2.h"
#include "module1.cpp"
…

module1.h
#include …

struct StrukData
{
   int pole1;
   short pole2;
   char* pole3;
   …
};


module1.cpp
#include “module1.h”

const StrukData objStruk[10]=
{
   {..,…,},
   {…,…,}.
    …
};

смысл следующий - в 2 модулях - mainwindow и unit2 мне надо использовать данные из массива objStruk - соотвественно чтобы получить к нему доступ надо подключить файл его описания - module1.cpp, на что в модуле unit2.cpp выдаются ошибки:
error: multiple definition of  ‘objStruk’
first defined here: mainwindow.cpp
как мне исправить эту ошибку при условии того, что структуру модуля module1 трогать нежелательно...

PM MAIL   Вверх
mes
Дата 23.9.2011, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(kuvshinka @  23.9.2011,  21:14 Найти цитируемый пост)
как мне исправить эту ошибку при условии того, что структуру модуля module1 трогать нежелатель

подключать заголовочные файлы, прочитав перед этим повнимательнее книжки на эту тему..

Добавлено через 1 минуту и 21 секунду
и при чем тут кроссплатформенное программирование ?!


--------------------
PM MAIL WWW   Вверх
kuvshinka
Дата 23.9.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



mes: Вы имеете ввиду, что надо вместо module1.cpp подключать module1.h? это я и сама так думала, но тогда все равно в модуле unit2.cpp (то есть там, где я пытаюсь использовать массив objStruk) уже в ввиде "вопроса"  (в синем кружке знак вопроса) пишется 
undefined reference to objStruk (что верно, ведь массив объектов структуры objStruk, который я пытаюсь использовать, инициализирован в cpp-файле, а я подключаю хедер)
и ошибка
collect2: ld returned 1 exit status

PM MAIL   Вверх
mes
Дата 24.9.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(kuvshinka @  23.9.2011,  22:56 Найти цитируемый пост)
 но тогда все равно в модуле

не все равно, а другая ошибка.. 
у вас не прилинкована та часть в которой массив..



--------------------
PM MAIL WWW   Вверх
kuvshinka
Дата 24.9.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



mes: а как ее прилинковать? как исправить эту ошибку? 
PM MAIL   Вверх
mes
Дата 24.9.2011, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(kuvshinka @  24.9.2011,  11:47 Найти цитируемый пост)
 как ее прилинковать? как исправить эту ошибку?  

если компилируете в IDE, то добавить исходник к проекту.. 




--------------------
PM MAIL WWW   Вверх
volatile
Дата 24.9.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



kuvshinka, в .h файле напишите:
extern const StrukData objStruk[10];
и подключайте его где нужно, сколько угодно.
а .cpp оставьте только 1 раз.

PM MAIL   Вверх
kuvshinka
Дата 24.9.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



mes: я компилирую в Qt Creator-e 4.6....какой именно исходник надо подключить к проекту? у меня и так все указанные выше модули (их cрр- и h -файлы) подключены в pro-файле проекта...

Добавлено через 11 минут и 59 секунд
volatile: в каком именно моем h - файле надо написать:
extern const StrukData objStruk[10];
и что значит "а .cpp оставьте только 1 раз." (опять же какой именно cpp-файл и что значит "оставить"?)
PM MAIL   Вверх
volatile
Дата 24.9.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(kuvshinka @  24.9.2011,  18:31 Найти цитируемый пост)
же какой именно cpp-файл и что значит "оставить"?) 

Это ваш сипипи. Назовём его kuvshinka.cpp
Цитата(kuvshinka @  23.9.2011,  22:14 Найти цитируемый пост)
const StrukData objStruk[10]=
{
   {..,…,},
   {…,…,}.
    …
};
Его дабавляете в проект 1 раз, естественно. И никуда больше не включаете.

А это ваш хедер, назовём его kuvshinka.h
Цитата(volatile @  24.9.2011,  15:38 Найти цитируемый пост)
extern const StrukData objStruk[10];

Ну и там где надо, (да не запрещено даже там, где не надо), добавляете:
#include “kuvshinka.h”


PM MAIL   Вверх
mes
Дата 25.9.2011, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  24.9.2011,  21:23 Найти цитируемый пост)
Назовём его kuvshinka.cpp

const по умолчанию имеет внутренее связывание, поэтому в cpp также нужно не забыть extern 
Код

extern const StrukData objStruk[10]=
{ ...
};



Это сообщение отредактировал(а) mes - 25.9.2011, 13:28


--------------------
PM MAIL WWW   Вверх
math64
Дата 26.9.2011, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Можно ещё так:
Код

// module1.h
struct StrukData { ... };
const StrukData* getStrukData();
int getStruktDataCount();
//module1.h
const StrukData objStruk[] = // Размер можно не указывать, компилятор сам посчитает.
{
};
// Вычисление размера - автоматически при добавлении данных
const int objStrukCount = sizeof(objStruk)/sizeof(objStruk[0]);
// Получить данные
const StrukData* getStrukData() { return objStruk; }
// Получить число данных
int getStruktDataCount() { return objStrukCount; }
//mainwindow.cpp, unit2.cpp
#include "module1.h"

void someFunction() {
  const StrukData* data = getStrukData();
  const int count = getStrukCount();
  for(int i = 0; i < count; i++) {
     doSomething(data[i]);
  }
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.