Какая-то непонятная проблема?

Написано

более трёх лет назад

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

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

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

Мой файл game. cpp:

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

If you want both to reference the same variable, one of them should have int k;, and the other should have extern int k;

For this situation, you typically put the definition (int k;) in one. cpp file, and put the declaration (extern int k;) in a header, to be included wherever you need access to that variable.

If you want each k to be a separate variable that just happen to have the same name, you can either mark them as static, like: static int k; (in all files, or at least all but one file). Alternatively, you can us an anonymous namespace:

Again, in all but at most one of the files.

In C, the compiler generally isn’t quite so picky about this. Specifically, C has a concept of a “tentative definition”, so if you have something like int k; twice (in either the same or separate source files) each will be treated as a tentative definition, and there won’t be a conflict between them. This can be a bit confusing, however, because you still can’t have two definitions that both include initializers–a definition with an initializer is always a full definition, not a tentative definition. In other words, int k = 1; appearing twice would be an error, but int k; in one place and int k = 1; in another would not. In this case, the int k; would be treated as a tentative definition and the int k = 1; as a definition (and both refer to the same variable).

There are many question about this error. But they are related to only a single variable.

asked May 28, 2015 at 9:03

Your project has two definitions of function WorldObjects2 : one is in the compilation unit test. cpp and other is in the compilation unit main. cpp because the header where the function is defined is included in these two cpp files.

Читайте также:  Yamaguchi коды ошибок

Either use function specifier inline

Or move the function definition to some cpp file leaving only a function declaration (without its definition) in the header.

Another approach is to make the function as having the internal linkage. For example you could add keyword static

or could place the function in an unnamed namespace within the given namespace.

2,1401 gold badge24 silver badges46 bronze badges

answered May 28, 2015 at 9:07

Vlad from MoscowVlad from Moscow

272k20 gold badges173 silver badges310 bronze badges

Scene. h (есть также Scene. cpp который включает этот хидер)

и есть BasicGame. h в котором тоже подключается Scene

жалуется на структуру из Сцена

Срочно надо решить пока брэйншторм не покинул

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

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

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

Так что я сейчас немного пишу свой код, и я не лучший в мире кодер. Я все еще учусь и считаю себя новичком. Я пишу лексический анализ для класса понятий в C ++. Я пробовал решения, которые я видел на таких веб-сайтах, как, например, использование extern в заголовочном файле и использование const в файлах cpp, но при этом отмечается, что работает. Когда я включаю свой заголовочный файл в 2 отдельных файла. cpp, я получаю эту ошибку для всех целых в заголовочном файле:

заголовочный файл =

token. cpp (объявляет, что делает getToken)

Добрый день, первый раз столкнулся с такой проблемой. При компиляции вылазит следующее для каждого метода:

Собственно сам код:
head

Main. cpp

generates these errors:

LNK1169 one or more multiply defined symbols found

LNK2005 _main already defined in Array. obj

What’s the problem here? Please do note that Array. cpp did have int main() defined in itself when it was included in the project for the first time, but no longer has it (neither does the ArrayStack. cpp). Also, the code compiles just fine when the int main() in main. cpp is omitted.

Ошибку обнаружен многократно определенный символ – один или более

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

Читайте также:  Как исправить ошибку Windows Update 0x80072EFD

Проверить список LIB файлов, которые задействованы в компановке (линковании). Например, добавили две библиотеки в которых определена одна и та же функция. Линкер в растерянности, какую функцию брать.

разбираться. у тебя одна функция есть в двух объектниках. Причем – не какая-попало, а main!

Убрал из #include “file. h”, в определенном месте определенный хедер (описание класса окна) и всё, правда, после этого пришлось часть кода переделывать ))

генерирует эти ошибки:

LNK1169 найден один или несколько кратно определенных символов

LNK2005 _основно уже определен в Array. obj

Решение

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

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

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

extern struct repFieldInfo det_rep_info;

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

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

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

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

Читайте также:  НЕ УДАЛОСЬ ОБНОВИТЬ ОПРЕДЕЛЕНИЕ СИСТЕМЫ ЗАЩИТЫ КОД ОШИБКИ 2147012894

static struct repFieldInfo det_rep_info;

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

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

extern int lANGLE=1,. eND=8

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

Когда вы исправите это, у вас будет та же проблема с map counter;

Что вы должны сделать, это ответить на вопрос, почему вы должны объявить все это в заголовочном файле. map counter; используется только в main. cpp, так что переместите его туда. И int переменные могут быть заменены одним enumпотому что, кажется, вы собираетесь использовать их в качестве возвращаемых значений для getToken(),

Так будет что то вроде

Сообщение об ошибке означает, что во всем скомпилированном коде, файлах *. obj, компоновщик находит более одного main() функция. Один явно в main. cpp.

Первое решение, которое приходит на ум, как уже упоминалось в комментариях, — это (принудительно) перекомпилировать, удалив файлы *. obj.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *