Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > [VS2005 C++]Линковка в VS2005 |
Автор: Random86 23.7.2007, 11:36 | ||||||
Пишу программу на VS2005. И все время возникает ошибка вовремя линковки: Linking... stdafx.obj : error LNK2005: "struct TID3Tag __clrcall ReadTAgMP3(char const *)" (?ReadTAgMP3@@$$FYM?AUTID3Tag@@PBD@Z) already defined in BaseMP3.objD:\Documents and Settings\Danger\Мои документы\Visual Studio 2005\Projects\BaseMP3\Debug\BaseMP3.exe : fatal error LNK1169: one or more multiply defined symbols found Такая ошибка всегда вылезает, если я использую любую самостоятельную написанную функцию. В данном случае код функции:
И когда в событие вызывается данная функция, вылетает ошибка.
А если закомментировать вызов функции
то ошибки нету. Сам проект ATL, но такая ошибка возникала и при написание консольных программ. Как я понял проблема с очисткой стека. Заранее спасибо всем ответившим. |
Автор: JackYF 24.7.2007, 00:57 |
Стек тут абсолютно не при чем. Твоя программа даже выполняться не начала. функция в каком файле определена? Проблема скорее всего в том, что тело функции оказывается включенным в программу несколько раз. Если оно находится в *.h-файле, то надо использовать стражей включения (впрочем, их надо использовать всегда). |
Автор: Random86 24.7.2007, 11:23 | ||||||
Я неверно выразился, ошибка на этапе организации очистки стека. Раньше когда такая ошибка выскакивала я статические переменные заменял на динамические, и ошибка пропадала.
Сначала функция была определена в stdafx.h, и там же реализована. Разбил эту функцию, как и положено в stdafx.h определение, а в stdafx.cpp реализация. Ошибка пропала, может я и не правильно работаю с модулями, так как писал до этого в Delphi, и по привычке все в один модуль включаю.
Имеется ввиду помечать их extern?(т.е тут объявлен, а реализация встретиться потом) |
Автор: Lazin 24.7.2007, 11:50 |
Создай отдельные h и cpp для своих ф-й, насколько я знаю stdafx - для прекомпиляции заголовков если не прав, поправьте. |
Автор: Earnest 24.7.2007, 19:52 | ||
Не делай так никогда. stdafx.h может содержать часто используемые системные и библиотечные заголовки (которые не меняются), а свои заголовки туда включать не стоит, а тем более объявления функций. Любое изменение stdafx.h - это полная перекомпиляция всего модуля (DLL или EXE). |
Автор: Dronchik 25.7.2007, 10:22 |
А полная перекомпиляция очень долго может длится. Так что делай как сказал JackYF. |