Lnk2005 c как исправить

от admin

Ошибка error LNK2005 [закрыт]

Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 6 лет назад .

Написал программу которая берет данные с сайта и выводит их в DataGridView, все работает когда одна форма. Но когда я добавил вторую форму, чтобы открывалось в ней повылазили ошибки:

Типа: Ошибка error LNK2005

Вы гениально продемонстрировали, как НЕ надо задавать вопросы. Никакой полезной информации, не совсем соответствующий тэг, не указан даже компилятор, вывалена вся куча ваших файлов.

Судя по тому, что такое ошибка LNK2005, вы ухитрились, например, дважды описать одну и ту же функцию — добавляя эту вторую форму. У вас в результате есть две функции с одним и тем же именем, и линковщик не знает, какую выбрать.

Вот официальное мнение MS :), почему такое происходит и что делать. Позвольте и мне задать вам вопрос: что здесь было непонятно для вас? (Потому что поверить в то, что человек не попытался разобраться с проблемой сам, и не искал решение на официальном сайте компилятора, а понесся сразу на SO — просто не могу. Программисты так не поступают :))

Смешивание статических и динамических библиотек при одновременном использовании /clr.

Символ является упакованной функцией (созданной путем компилирования с параметром /Gy) и был включен более чем в один файл, но изменен в промежутке между компиляциями. Перекомпилируйте все файлы, включающие symbol.

Символ определен по-разному в двух объектах-членах в различных библиотеках, и оба объекта-члена используются.

Абсолютное значение определено дважды с различными значениями.

Файл заголовка объявлен и определен как переменная. Ниже представлены возможные решения.

Объявите переменную в H-файле: extern BOOL MyBool;, а затем присвойте ей значение в C-файле или CPP-файле: BOOL MyBool = FALSE;.

lnk2005 — ошибка C ++ LNK 2005, уже определенная в .obj

Я получаю эту ошибку LNK 2005, несмотря на то, что я создал класс игры, используя правильный заголовочный файл и формат файла cpp, насколько мне известно.

Который после поиска проблемы в течение некоторого времени, кажется, является основной причиной этой ошибки, кто-нибудь может увидеть, что я испортил?

Мой файл game.h выглядит следующим образом:

Мой файл game.cpp:

Мое главное — буквально просто создать экземпляр объекта на данный момент.

Как избежать ошибки компоновщика lnk2005 для переменных, определенных в файле заголовка?

имейте в виду, что #include примерно так же, как вырезание и вставка включенного файла внутри исходного файла, который включает его (это грубая аналогия, но вы понимаете суть). Это означает, если у вас есть:

в файле заголовка, и этот файл заголовка включен тремя исходными файлами в программу, тогда все они будут иметь глобальное имя x, определенное, которое будет конфликтовать.

Читать:
Как скинуть ссылку на приложение в play market

что вы хотите сделать, это определить переменную как extern, так что .cpp файлы будут заявление, а потом в одном из ваших .cpp файлы дают фактическое определение.

конечно, я бы рекомендовал против глобалов, но если вы должны использовать их, это удержит их от конфликта.

это потому, что компилятор компилирует каждый .cpp файл отдельно, создавая .obj файл для каждого из них. Ваш заголовок, похоже, имеет что-то вроде:

когда это включено в каждый из ваших трех вы получаете три копии int slider переменная, как если бы вы объявили ее в каждом . Компоновщик жалуется на это, потому что у вас нет трех разных вещей с одним и тем же именем.

что вы, вероятно, хотите сделать, это изменить файл заголовка, чтобы прочитать:

это говорит компилятору, что есть slider переменная где-то, но, возможно, не здесь, и позволяет компоновщику понять это. Затем в один :

дает компоновщику одну фактическую переменную для связи.

потому что «int slider» уже определен в другом файле? Проверьте, что у вас есть защита заголовка.

если он находится в нескольких единицах перевода, и вы хотите, чтобы переменные были разными (т. е. не глобальными), то, возможно, объявите их в анонимном пространстве имен:

Если вы хотите, чтобы они были глобальными, посмотрите на решение Джеймса.

что происходит, так это то, что каждая из переменных из переменных.h дается глобальная область для каждого из отдельных файлов C. Когда компоновщик собирает все файлы C, он видит несколько переменных с одинаковым именем.

Если вы хотите использовать переменные из файла заголовка в качестве глобальных переменных, вам придется использовать ключевое слово «extern» перед всеми из них, а в главном файле не используйте ключевое слово extern.

Вы можете создать две переменные файлов.h И EVariables.h, или просто объявите переменные в main.файл cpp.

гораздо лучший способ сделать это-создать класс переменных и передать ссылку на класс.

Я знаю, что это старый поток, но я наткнулся на это как один из первых результатов поиска от Google. Я решил проблему, поместив переменную static.

я попробовал extern и в моей ситуации, которая, похоже, не решила проблему.

этой ошибки связывания также можно избежать, если переменные включены несколько раз через «переменные».h » объявляются как const.

у меня тоже была эта ошибка, хотя я работаю с определениями extern. Проблема заключалась в инициализации переменных в определениях extern:

Как исправить ошибку линковая файлов С++ в VS 2017(LNK2005)?

5ae43dbb2f7b7003435962.jpeg5ae43dc33f59b774396348.jpeg

1. В *.h файлах должны быть только заголовки функций и объявления глобальных переменных.

2. *.cpp файлы не пишут в #include’ах ( в них пишут только *.h ) , *.cpp компилируются отдельно и потом полученные объектные файлы линкуются вместе в один исполняемый.

3. Для избежания включения несколько раз одного и того же файла используйте #ifndef:

Похожие статьи