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

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, но такая ошибка возникала и при написание консольных программ. Как я понял проблема с очисткой стека. Заранее спасибо всем ответившим.

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

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

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

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

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

Автор: Random86 24.7.2007, 11:23
Цитата

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

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

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

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

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

Имеется ввиду помечать их extern?(т.е тут объявлен, а реализация встретиться потом)

Автор: Lazin 24.7.2007, 11:50
Создай отдельные h и cpp для своих ф-й, насколько я знаю stdafx - для прекомпиляции заголовков если не прав, поправьте.

Автор: JackYF 24.7.2007, 13:34
Цитата(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 реализация. Ошибка пропала,

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

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

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

Автор: Dronchik 25.7.2007, 10:22
А полная перекомпиляция очень долго может длится. Так что делай как сказал JackYF.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)