|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.08.2013, 16:06 | #1 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
многомодульная программа, ошибки компоновщика
Столкнулся с кучей проблем при разделении программы на модули.
постоянно получаю тонны ошибок линкера на тему "ссылка на неразрешенный внешний символ" или "ххх уже определен в ...". собственно как правильно поделить код по файлам? в книжке читал что феншуйно так: интерфейс класса в хедер и подключать везде, где используется этот класс + в хедере прописать #ifnfef ..... ну и дальше ясно реализацию в срр и сунуть в проект, а линкер там уж его найдет. но со временем все усложнилось: инлайн функции надо определять прямо в хедере, а то компил ругается шаблоны тоже, иначе получаю пресловутые ошибки из-за отсутствия инстанцирования при этом я не знаю как поступать с глобальными функциями, если написать в хедере их прототипы, а в срр реализации это тоже не всегда работает, почему то бывает линкер их не находит более того, когда в решении (пишу в visual studio) становится много проектов бывает линкер не находит и реализации классов (предположительно это из-за того что реализация в другом проекте), хотя если подключить реализацию, он ругнется на повторное определение как же все-таки сделать так что бы было удобно как со стандартными библиотеками? посоветуйте может книжку/статью... |
01.08.2013, 16:21 | #2 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
|
01.08.2013, 16:35 | #3 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
я читал что переменные нужно extern, так и делаю (и все ок!), а вот функции extern не обязательно, т.е. слово просто пропускается, главное чтобы был прототип
или из хедера убрать #ifndef ...... и тогда будет ок? |
01.08.2013, 17:37 | #4 |
Форумчанин
Регистрация: 09.07.2013
Сообщений: 249
|
Попробуй все варианты включая предложенные и посмотри как лучше, потом отпишись ок?
do not use your brain
|
01.08.2013, 18:17 | #5 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
отписываюсь:
для переменных extern необходим, и все работает для функций extern значения не имеет (проверил) пробовал убрать #ifndef из хедера (в котором функции глобальные) - проблемы не решает (ожидаемо), ведь ошибка не "не знаю что за функция", а "тело функции не найдено" могу добавить что если все методы определять внутри класса, то все работает, единственное, читать это мне абсолютно не нравится я пробовал кучу вариантов, и все это кончалось безумными времязатратами и брутом, как бы наконец угодить компоновщику, где достаточно хедера, а где придется сунуть срр |
01.08.2013, 19:01 | #6 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
#ifndef
#define #endif Директивы, в совокупности, осуществляющие защиту от переподключения заголовочных файлов, что может привести к проблеме неоднозначности имен в модулях приложения. |
01.08.2013, 19:37 | #7 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
мне нужно в срр файлах(где реализации классов) везде прописать вот таких вот "стражей"? и в заголовочном файле тоже? я просто запутался что куда писать уже.
и должны ли быть имена после #define одинаковыми или разными? |
01.08.2013, 20:30 | #8 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
cpp файлы вы не подключаете, а вот headers - подключаете. В headers такая защита и ставиться.
Можете вместо этого использовать #pragma once (директива, разработанная Microsoft и включенная в Visual C++). |
01.08.2013, 20:39 | #9 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
блин ну так ведь и делаю! но...
могут быть какие-то проблемы из-за того что не один проект, а несколько. потому что я помню раньше так делал и все работало |
01.08.2013, 20:47 | #10 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
она как бы не только там есть, и мс тут не причем. Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |