Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2013, 16:06   #1
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию многомодульная программа, ошибки компоновщика

Столкнулся с кучей проблем при разделении программы на модули.
постоянно получаю тонны ошибок линкера на тему "ссылка на неразрешенный внешний символ" или "ххх уже определен в ...".

собственно как правильно поделить код по файлам?

в книжке читал что феншуйно так:

интерфейс класса в хедер и подключать везде, где используется этот класс
+ в хедере прописать #ifnfef ..... ну и дальше ясно
реализацию в срр и сунуть в проект, а линкер там уж его найдет.

но со временем все усложнилось:

инлайн функции надо определять прямо в хедере, а то компил ругается
шаблоны тоже, иначе получаю пресловутые ошибки из-за отсутствия инстанцирования

при этом я не знаю как поступать с глобальными функциями, если написать в хедере их прототипы, а в срр реализации это тоже не всегда работает, почему то бывает линкер их не находит

более того, когда в решении (пишу в visual studio) становится много проектов бывает линкер не находит и реализации классов (предположительно это из-за того что реализация в другом проекте), хотя если подключить реализацию, он ругнется на повторное определение

как же все-таки сделать так что бы было удобно как со стандартными библиотеками?

посоветуйте может книжку/статью...
denrubun вне форума Ответить с цитированием
Старый 01.08.2013, 16:21   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от denrubun Посмотреть сообщение
при этом я не знаю как поступать с глобальными функциями, если написать в хедере их прототипы, а в срр реализации это тоже не всегда работает, почему то бывает линкер их не находит
Тут уже нужна внешняя линковка. Т.е extern.
Igor95 вне форума Ответить с цитированием
Старый 01.08.2013, 16:35   #3
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

я читал что переменные нужно extern, так и делаю (и все ок!), а вот функции extern не обязательно, т.е. слово просто пропускается, главное чтобы был прототип
или из хедера убрать #ifndef ...... и тогда будет ок?
denrubun вне форума Ответить с цитированием
Старый 01.08.2013, 17:37   #4
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от denrubun Посмотреть сообщение
я читал что переменные нужно extern, так и делаю (и все ок!), а вот функции extern не обязательно, т.е. слово просто пропускается, главное чтобы был прототип
или из хедера убрать #ifndef ...... и тогда будет ок?
Попробуй все варианты включая предложенные и посмотри как лучше, потом отпишись ок?
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 01.08.2013, 18:17   #5
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

отписываюсь:
для переменных extern необходим, и все работает
для функций extern значения не имеет (проверил)
пробовал убрать #ifndef из хедера (в котором функции глобальные) - проблемы не решает (ожидаемо), ведь ошибка не "не знаю что за функция", а "тело функции не найдено"

могу добавить что если все методы определять внутри класса, то все работает, единственное, читать это мне абсолютно не нравится

я пробовал кучу вариантов, и все это кончалось безумными времязатратами и брутом, как бы наконец угодить компоновщику, где достаточно хедера, а где придется сунуть срр
denrubun вне форума Ответить с цитированием
Старый 01.08.2013, 19:01   #6
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

#ifndef
#define
#endif
Директивы, в совокупности, осуществляющие защиту от переподключения заголовочных файлов, что может привести к проблеме неоднозначности имен в модулях приложения.
Igor95 вне форума Ответить с цитированием
Старый 01.08.2013, 19:37   #7
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

мне нужно в срр файлах(где реализации классов) везде прописать вот таких вот "стражей"? и в заголовочном файле тоже? я просто запутался что куда писать уже.
и должны ли быть имена после #define одинаковыми или разными?
denrubun вне форума Ответить с цитированием
Старый 01.08.2013, 20:30   #8
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

cpp файлы вы не подключаете, а вот headers - подключаете. В headers такая защита и ставиться.
Можете вместо этого использовать #pragma once (директива, разработанная Microsoft и включенная в Visual C++).
Igor95 вне форума Ответить с цитированием
Старый 01.08.2013, 20:39   #9
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

блин ну так ведь и делаю! но...
могут быть какие-то проблемы из-за того что не один проект, а несколько.
потому что я помню раньше так делал и все работало
denrubun вне форума Ответить с цитированием
Старый 01.08.2013, 20:47   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
#pragma once (директива, разработанная Microsoft и включенная в Visual C++).
чего чего?
она как бы не только там есть, и мс тут не причем.
Цитата:
могут быть какие-то проблемы из-за того что не один проект, а несколько.
потому что я помню раньше так делал и все работало
такие что если другие типы проекта это библиотеки, то их надо включать в зависимости основного проекта.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi7 Многомодульная программа viktor178 Помощь студентам 9 17.06.2013 20:03
Ошибки компоновщика при использовании С++ в WinForms Jugger Общие вопросы .NET 1 31.03.2013 10:50
Ключи для компоновщика в Delphi Altera Общие вопросы Delphi 7 05.03.2010 07:23
Ошибка компоновщика senator2202 Общие вопросы C/C++ 11 13.12.2009 19:52
Настройка компоновщика в Builder 2009 Innovator_King C++ Builder 1 01.10.2009 11:39