Error lnk2005 уже определен в obj

Я пытался решить проблему, связанную с модулями компиляции.

Я получаю ошибку

Это единственная ошибка, которую я получаю. Вот включения для каждого соответствующего класса, участвующего в порядке от самого высокого на дереве до самого низкого …

Моя проблема связана с тем, что даже если я помещаю файлы в одну папку / решение, я не могу заставить их не определять себя дважды. Даже при использовании ключевого слова Pragma Once. Я также попытался использовать старую школу #define, не включайте, если она уже существует … это тоже не сработало.

Есть ли у вас какие-либо решения или рекомендации?

Решение

#pragma once предотвращает многократное включение заголовка в одну единицу компиляции — в данном случае файл .obj — и ошибка прямо заявляет, что frtinvxml.obj определяет то, что уже было определено в Frtinv.obj. Два отдельных объекта. Два отдельных сборника.

once отлично работал в случае Frtinv.obj и снова в случае frtinvxml.obj. Оба имеют одно и то же определение, иначе источники не были бы скомпилированы. К сожалению, компоновщик пытается поместить оба объекта в один и тот же вывод.

Два решения для этого, в зависимости от того, как переменная будет использоваться, но для обоих не делать объявления в заголовках. Это почти всегда плохо кончается.

в соответствующем заголовке. extern говорит компилятору это где-то det_rep_info будет объявлено, и компиляция должна продолжать использовать этот внешний det_rep_info ,

В файле cpp, frtinvxml.cpp, Frtinv.cpp или в каком-то третьем cpp, который содержит общие данные, объявите

Затем сделайте то же самое с остальными тремя дублирующимися переменными.

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

в каждом файле cpp, который требует этого. Повторите для всех необходимых переменных. static гарантирует, что каждый det_rep_info виден только в определенной области. В этом случае один блок компиляции. Там на самом деле немного тонкости, так что читать документацию Чтобы убедиться static подходит для вас.

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

в соответствующем заголовке. extern говорит компилятору, что где-то det_rep_info будет объявлено и что компиляция должна продолжать использовать этот внешний det_rep_info .

В файле cpp, frtinvxml.cpp, Frtinv.cpp или в каком-то третьем cpp, который содержит общие данные, объявите

Затем сделайте то же самое с остальными тремя дублирующимися переменными.

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

в каждом файле cpp, который требует этого. Повторите для всех необходимых переменных. static гарантирует, что каждый det_rep_info виден только в определенной области. В этом случае один блок компиляции. Там на самом деле есть немного тонкости, поэтому прочитайте документацию, чтобы убедиться, что static она подходит именно вам.

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

Здравствуйте. Имеется у меня 3 файла:

Я хотел объявить 2 глобальные переменные:

Объявил их в Vector.h, в двух других файлах пробовал

А также подобные различные комбинации различных возможных вариантов, прочел несколько статей на форумах, но тем не менее почему-то постоянно выдает ошибку:

Error 6 error LNK2005: "int quantity_copy" (?quantity_copy@@3HA) already defined in main.obj Error 7 error LNK2005: "int quantity_allocates" (?quantity_allocates@@3HA) already defined in main.obj Error 8 error LNK1169: one or more multiply defined symbols found

Помогите, пожалуйста, разобраться, в чем проблема.

1 ответ 1

Следует различать объявление и определение переменной.

Определение переменной должно встречаться только один раз во всей программе, объявления могут встречаться сколько угодно раз — они подсказывают компилятору, что в каком-то из программных модулей существует определение этой переменной.


[an error occurred while processing the directive]
Карта сайта