Ошибка средств компоновщика LNK2005
За этой ошибкой следует неустранимая ошибка LNK1169.
Возможные причины и способы устранения
Как правило, эта ошибка означает, что вы нарушили одно правило определения, которое разрешает только одно определение для любого используемого шаблона, функции, типа или объекта в данном файле объекта и только одно определение всего исполняемого файла для внешних видимых объектов или функций.
Ниже приведены некоторые распространенные причины этой ошибки.
-
Эта ошибка может возникать, когда файл заголовка определяет переменную. Например, если этот файл заголовка включен в проект несколько исходных файлов, результаты ошибки:
// LNK2005_global.h int global_int; // LNK2005
- Объявите переменную extern в файле заголовка: extern int global_int; затем определите ее и при необходимости инициализировать ее в одном и только одном исходном файле: int global_int = 17; Эта переменная теперь является глобальной, которую можно использовать в любом исходном файле, объявив его extern , например, включив файл заголовка. Мы рекомендуем это решение для переменных, которые должны быть глобальными, но хорошая практика проектирования программного обеспечения сводит к минимуму глобальные переменные.
- Объявите статическую переменную: static int static_int = 17; . Это ограничивает область определения текущим файлом объектов и позволяет нескольким файлам объектов иметь собственную копию переменной. Не рекомендуется определять статические переменные в файлах заголовков из-за возможности путаницы с глобальными переменными. Предпочитайте перемещать определения статических переменных в исходные файлы, которые используют их.
- Объявите переменную selectany: __declspec(selectany) int global_int = 17; . Это сообщает компоновщику выбрать одно определение для использования всеми внешними ссылками и отсодействовать карта остальные. Это решение иногда полезно при объединении библиотек импорта. В противном случае мы не рекомендуем использовать его как способ избежать ошибок компоновщика.
// LNK2005_func.h int sample_function(int k) < return 42 * (k % 167); >// LNK2005
- inline Добавьте ключевое слово в функцию:
// LNK2005_func_inline.h inline int sample_function(int k)
// LNK2005_func_decl.h int sample_function(int);
// LNK2005_func_impl.cpp int sample_function(int k)
// LNK2005_member_outside.h class Sample < public: int sample_function(int); >; int Sample::sample_function(int k) < return 42 * (k % 167); >// LNK2005
Чтобы устранить эту проблему, переместите определения функции-члены внутри класса. Функции-члены, определенные внутри объявления класса, неявно встраиваются.
// LNK2005_member_inline.h class Sample < public: int sample_function(int k) < return 42 * (k % 167); >>;
oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject already defined in uuid.lib(go7.obj)
Как исправить ошибку линковая файлов С++ в VS 2017(LNK2005)?


— тоже не рабит(
В гугле нашел информацию про переопределение в нескольких файлах одной и той же функции, но у меня всего 1 файл с определением и подключаю его всего 1 раз;
Если мысль, что ошибка из-за того, что подключаю как-то так: Source.cpp -> MyForm.h -> MyForm.cpp.
Подскажите, как правильно!
- Вопрос задан более трёх лет назад
- 568 просмотров
3 комментария
Средний 3 комментария

Станислав Макаров @Nipheris Куратор тега C++
Зачем вы инклудите cpp-шник? Вам не кажется это странным? У вас есть какие-либо причины для этого?

Evgeny Proff @EvgenyProff Автор вопроса
Станислав Макаров, потому что
Возможно напутал с пространством имен или подключением, но если создать заголовок H1.h, где написать:
#include "source.cpp" void solve();
— тоже не рабит(
нет желания переписывать 1.3к строк кода куда-либо из файла, нужно только вне этого файла вызвать 1 функцию.
Евгений Шатунов @MarkusD Куратор тега C++
Evgeny Proff , да, студия у тебя клевая, подсветка темная, все модно-молодежно. Ничего не видно. Убирай картинки, замени их на тег code. Большие вставки кода — в спойлеры с пояснениями.
Решения вопроса 1
1. В *.h файлах должны быть только заголовки функций и объявления глобальных переменных.
2. *.cpp файлы не пишут в #include’ах ( в них пишут только *.h ) , *.cpp компилируются отдельно и потом полученные объектные файлы линкуются вместе в один исполняемый.
3. Для избежания включения несколько раз одного и того же файла используйте #ifndef:
// файл MyForm.h #ifndef __MYFORM__ #define __MYFORM__ // здесь содержимое файла #endif
Ответ написан более трёх лет назад
Нравится 1 4 комментария

Evgeny Proff @EvgenyProff Автор вопроса
Возможно я неправильно сформулировал вопрос:
Есть файл *h и файл *cpp, мне нужно в файле *h вызвать функцию из файла *cpp того же проекта.
Как я могу это сделать?
Evgeny Proff, в файлах *.h ничего не должно вызываться, в них вообще не должно быть определений функций, только их прототипы (заголовки). А сами эти функции объявляются в *.cpp файле с таким же именем. *.h файл включается в файлы где нужно использовать функции из *.cpp файла.

Evgeny Proff @EvgenyProff Автор вопроса
Игорь, Вы имеете в виду то, что следует определения функций интерфейса у формы перенести в Form.h -> Form.cpp и там работать. Через часик апдейтну.
Ошибка error LNK2005 [закрыт]
Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Закрыт 7 лет назад .
Написал программу которая берет данные с сайта и выводит их в DataGridView, все работает когда одна форма. Но когда я добавил вторую форму, чтобы открывалось в ней повылазили ошибки: Типа: Ошибка error LNK2005
Отслеживать
51.3k 87 87 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
задан 31 окт 2016 в 5:10
11 1 1 золотой знак 1 1 серебряный знак 2 2 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вы гениально продемонстрировали, как НЕ надо задавать вопросы. Никакой полезной информации, не совсем соответствующий тэг, не указан даже компилятор, вывалена вся куча ваших файлов.
Судя по тому, что такое ошибка LNK2005, вы ухитрились, например, дважды описать одну и ту же функцию — добавляя эту вторую форму. У вас в результате есть две функции с одним и тем же именем, и линковщик не знает, какую выбрать.
Вот официальное мнение MS :), почему такое происходит и что делать. Позвольте и мне задать вам вопрос: что здесь было непонятно для вас? (Потому что поверить в то, что человек не попытался разобраться с проблемой сам, и не искал решение на официальном сайте компилятора, а понесся сразу на SO — просто не могу. Программисты так не поступают :))
- Смешивание статических и динамических библиотек при одновременном использовании /clr.
- Символ является упакованной функцией (созданной путем компилирования с параметром /Gy) и был включен более чем в один файл, но изменен в промежутке между компиляциями. Перекомпилируйте все файлы, включающие symbol.
- Символ определен по-разному в двух объектах-членах в различных библиотеках, и оба объекта-члена используются.
- Абсолютное значение определено дважды с различными значениями.
- Файл заголовка объявлен и определен как переменная. Ниже представлены возможные решения. Объявите переменную в H-файле: extern BOOL MyBool;, а затем присвойте ей значение в C-файле или CPP-файле: BOOL MyBool = FALSE;. Объявите переменную как static. Объявите переменную как selectany.
- Вы используете uuid.lib в сочетании с другими файлами LIB, определяющими идентификаторы GUID (например oledb.lib и adsiid.lib).
Научный форум dxdy
Переменные только этого класса, и EDP.obj — компилируется всего из двух файлов ххх.cpp и ххх.h
Правда, я сначала создал класс из темплейта и затем копипаст. Но все равно почему появляется дублирование?
Re: Как устранить ошибку LNK2005 : MS VS 2017
22.03.2018, 19:13
| Заслуженный участник |
Последний раз редактировалось EtCetera 22.03.2018, 19:25, всего редактировалось 2 раз(а).
Навскидку такое возможно, если у Вас эти (глобальные) переменные попросту определены в заголовочном файле, который подключается в несколько cpp -файлов.
Re: Как устранить ошибку LNK2005 : MS VS 2017
22.03.2018, 19:42
Если честно, то я не профессиональный программист.
Поэтому проекты иногда весьма кривые. Первоначальный проект был специально упрощен так, чтобы исключить классы. Более того, кроме основного cpp файла практически все остальные кодовые программы и определялись и писались в h файлах.
Но именно этот класс раньше, лет 6 назад вполне себе работал. Как может его h файл попасть куда-то еще, не знаю, тем более ошибка прямо указывает, что повторное переопределение исключительно в EDP.obj полученного из EDP.cpp хотя сейчас посмотрю.
Что до программы
EDP *edp = NULL;
edp = new EDP(3, Img_ST, X, Y, L);
edp->Intermed(dispL, dispR);
пока единственное ссылка на класс в головном файле. Там же
#include «EDP.h»
Re: Как устранить ошибку LNK2005 : MS VS 2017
22.03.2018, 19:53
| Заслуженный участник |
Если Вы никакой специфики не напишете, то Вам никто не сможет помочь. Пока даже непонятно, что такое sigmaix .
Re: Как устранить ошибку LNK2005 : MS VS 2017
22.03.2018, 19:56
Вот все ошибки. Странно, что всего 14, переменных больше.
Severity Code Description Project File Line Suppression State
Error LNK2005 «int m_nPixels» (?m_nPixels@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int sigmai» (?sigmai@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int m_width» (?m_width@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int sigmaX» (?sigmaX@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int sigmai2» (?sigmai2@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «double * TBi_ws» (?TBi_ws@@3PANA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int m_height» (?m_height@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «double * Bi_ws» (?Bi_ws@@3PANA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int sigmaY» (?sigmaY@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int sigmaiy» (?sigmaiy@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK2005 «int sigmaix» (?sigmaix@@3HA) already defined in EDP.obj segment C:\Users\\OneDrive\ST_intr\segment\segment.obj 1
Error LNK1169 one or more multiply defined symbols found segment C:\Users\\OneDrive\ST_intr\Release\segment.exe 1