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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VS2005 C++]Линковка в VS2005, Ошибка линкера в VS2005. 
V
    Опции темы
Random86
Дата 23.7.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу программу на 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
Такая ошибка всегда вылезает, если я использую любую самостоятельную написанную функцию. В данном случае код функции:
Код

TID3Tag ReadTagMP3(const char* FileName)
{
    TID3TagBuffer IDFile;
    FILE *pFileMP3;
    if ((pFileMP3=fopen("FileName","rt"))!=NULL)
    {
        fseek(pFileMP3,-128,SEEK_END);
        fread(&IDFile,sizeof(TID3TagBuffer),1,pFileMP3);
        fclose(pFileMP3);
    }
    TID3Tag ID;
    ID.Album[sizeof(ID.Album)-1]='\0';
    ID.Artist[sizeof(ID.Artist)-1]='\0';
    ID.Comment[sizeof(ID.Comment)-1]='\0';
    ID.ID[sizeof(ID.ID)-1]='\0';
    ID.Titel[sizeof(ID.Titel)-1]='\0';
    ID.Year[sizeof(ID.Year)-1]='\0';
    _memccpy(&ID.Album,&IDFile.Album,'\0',sizeof(IDFile.Album));
    _memccpy(&ID.Artist,&IDFile.Artist,'\0',sizeof(IDFile.Artist));
    _memccpy(&ID.Comment,&IDFile.Comment,'\0',sizeof(IDFile.Comment));
    _memccpy(&ID.Genre,&IDFile.Genre,0,sizeof(IDFile.Genre));
    _memccpy(&ID.ID,&IDFile.ID,'\0',sizeof(IDFile.ID));
    _memccpy(&ID.Titel,&IDFile.Titel,'\0',sizeof(IDFile.Titel));
    _memccpy(&ID.Year,&IDFile.Year,'\0',sizeof(IDFile.Year));

    return ID;
}

И когда в событие вызывается данная функция, вылетает ошибка.
Код

{…
TID3Tag ID = ReadTagMP3(FileName);
…}

А если закомментировать вызов функции
Код

{…
TID3Tag ID; //= ReadTagMP3(FileName);
…}

то ошибки нету.
Сам проект ATL, но такая ошибка возникала и при написание консольных программ. Как я понял проблема с очисткой стека. Заранее спасибо всем ответившим.

PM MAIL   Вверх
JackYF
Дата 24.7.2007, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Random86 @  23.7.2007,  11:36 Найти цитируемый пост)
Как я понял проблема с очисткой стека.

Стек тут абсолютно не при чем. Твоя программа даже выполняться не начала.

функция
Цитата(Random86 @  23.7.2007,  11:36 Найти цитируемый пост)
TID3Tag ReadTagMP3(const char* FileName)

в каком файле определена?

Проблема скорее всего в том, что тело функции оказывается включенным в программу несколько раз.
Если оно находится в *.h-файле, то надо использовать стражей включения (впрочем, их надо использовать всегда).



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Random86
Дата 24.7.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Стек тут абсолютно не при чем. Твоя программа даже выполняться не начала.

Я неверно выразился, ошибка на этапе организации очистки стека. Раньше когда такая ошибка выскакивала я статические переменные заменял на динамические, и ошибка пропадала. 
Цитата

в каком файле определена?

Сначала функция была определена в stdafx.h, и там же реализована. Разбил эту функцию, как и положено в stdafx.h определение, а в stdafx.cpp реализация. Ошибка пропала, может я и не правильно работаю с модулями, так как писал до этого в Delphi, и по привычке все в один модуль включаю.
Цитата

...то надо использовать стражей включения (впрочем, их надо использовать всегда).

Имеется ввиду помечать их extern?(т.е тут объявлен, а реализация встретиться потом)
PM MAIL   Вверх
Lazin
Дата 24.7.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Создай отдельные h и cpp для своих ф-й, насколько я знаю stdafx - для прекомпиляции заголовков если не прав, поправьте.
PM MAIL Skype GTalk   Вверх
JackYF
Дата 24.7.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Random86 @  24.7.2007,  11:23 Найти цитируемый пост)
Имеется ввиду помечать их extern?(т.е тут объявлен, а реализация встретиться потом) 

нет, имеется в виду, что твои вручную написанные .h - файлы нужно обрамлять чем-то типа:
Код

#ifndef MY_HEADER
#define MY_HEADER
...
#endif

Погугли, узнаешь больше.


Цитата(Random86 @  24.7.2007,  11:23 Найти цитируемый пост)
Сначала функция была определена в stdafx.h, и там же реализована. Разбил эту функцию, как и положено в stdafx.h определение, а в stdafx.cpp реализация. Ошибка пропала,

Ну вообще-то это системный файл, свои функции лучше в своих файлах и делать...
Я так понял, проблема решена? Если да, то закрывай тему.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Earnest
Дата 24.7.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Random86 @  24.7.2007,  12:23 Найти цитируемый пост)
Сначала функция была определена в stdafx.h, и там же реализована

Не делай так никогда.
stdafx.h может содержать часто используемые системные и библиотечные заголовки (которые не меняются), а свои заголовки туда включать не стоит, а тем более объявления функций.
Любое изменение stdafx.h - это полная перекомпиляция всего модуля (DLL или EXE).



--------------------
...
PM   Вверх
Dronchik
Дата 25.7.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Звукач ёмаё
**


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

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



А полная перекомпиляция очень долго может длится. Так что делай как сказал JackYF.


--------------------
Вместо слов делай дело, от которого ты фанатеешь. (с)

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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