Техника

Программа в с++ выдаёт: ошибку обнаружен многократно определенный символ - один или более

------Построение начато: проект: юка, Конфигурация: Debug Win32 ------
ver_tel_kruskal.obj : error LNK2005: _main уже определен в djk.obj
C:\Users\Александр\Documents\Visual Studio 2010\Projects\юка\Debug\юка. exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Что с этим делать?
Причина, указанная Андреем Котоусовым, возможна, но маловероятна. Те, кто линкует в свой экзешник множество библиотек, не задают таких вопросов. Тем более что в современных библиотеках используются namespace'ы, так что столкновения имен обычно не происходит.

А ВЕРОЯТНАЯ причина вот какая. Вы поместили определение функции (подчеркиваю, именно определение, то есть ТЕЛО функции, а не ее декларацию) в *.h файл. Если этому файлу сделан #include только в ОДИН *.cpp файл, то линковка пройдет и линковщик ни на что не пожалуется. Но если этому файлу сделан #include в два или более *.cpp файлов, то после компиляции в каждом из них возникнет та же самая функция. Линковщик выругается, что видит больше одной функции с одним и тем же прототипом. Решения у этой проблемы два: или перенести тело функции в *.cpp файл, оставив в *.h файле только декларацию (прототип) , или оставить функцию на месте, но объявить ее inline.

Тот же самый эффект может получиться не только с функциями, но и с другими объектами. Скажем, для статических членов класса нужно давать определение в *.срр файле, за пределами определения класса. Но если вы поместите это определение в *.h файл, а затем сделаете этому файлу #include в два или более *.cpp файлов, то линковщик выругается, что он видит несколько определений одного и того же символа.

Кстати, Михаил Левин неправ: чтобы получить такую жалобу от линковщика, совершенно не обязательно сдублировать определение ИМЕННО фунции main. Любая функция проканает.
Дмитрий Верховых
Дмитрий Верховых
43 607
Лучший ответ
разбираться. у тебя одна функция есть в двух объектниках. Причем - не какая-попало, а main!
Екатерина Борт
Екатерина Борт
75 052
Проверить список LIB файлов, которые задействованы в компановке (линковании) . Например, добавили две библиотеки в которых определена одна и та же функция. Линкер в растерянности, какую функцию брать.
Валерий По
Валерий По
77 317
Убрал из #include "file.h", в определенном месте определенный хедер (описание класса окна) и всё, правда, после этого пришлось часть кода переделывать ))