mingw32 / bin / ld.exe ... неопределенная ссылка на [class] ... collect2.exe: ошибка: ld вернул 1 состояние выхода - PullRequest
1 голос
/ 20 января 2020

Описание проблемы, когда я пытаюсь переместить мой код с Linux на Windows:

  • MinGW при Windows проблемы с компоновщиком
  • происходит, когда я вызываю пользовательский класс внутри моего Main. cpp (работает нормально, если я не вызываю конструктор пользовательских классов в Main)

Соответствующие примеры кода:

Person.hpp

class Person
{
    public:
        Person(const string& iName, 
                const list<string>& iContactDetails,
               ); 

        virtual ~Person(); 
        ...

Main. cpp

#include "Person.hpp"
...
int main()
{
...
Person myPerson = Person (myName, myContactDetails); //here is the linker problem
...
return 0;
}

Команда компиляции:

автономный

g++ -o MyProgram.exe Main.cpp -Wall

Makefile (пробовал даже CC вместо CXX, или LDFLAGS = -lgdi32 вместо CXXFLAGS)

EXECUTABLE = MyProgram.exe

CXX = "C:\MinGW\bin\g++.exe"
CXXFLAGS = -Wall      // tried LDFLAGS=-lgdi32 as well

src = $(wildcard *.cpp)
obj = $(src:.cpp=.o)

all: myprog

myprog: $(obj)
    $(CXX) -o $(EXECUTABLE) $^ $(CXXFLAGS)

.PHONY: clean
clean:
    del $(obj) $(EXECUTABLE)

Ошибка:

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\....:Main.cpp:(.text+0x124c): undefined reference to `Person::~Person()'
collect2.exe: error: ld returned 1 exit status

Как итог, я сталкиваюсь с проблемами компоновщика на этапе компиляции MinGW G ++:

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

Я пытался следовать другим подобным проблемам, но, к сожалению, это другие проблемы:

  1. C ошибка компилятора: неопределенная ссылка на функцию
  2. Что такое неопределенная ссылка / нерешенная внешняя ошибка символа и как ее исправить?
  3. возникла ошибка при связывании кодов в c ++

Как мне изменить мой Makefile или мой код? Какие флаги использует MinGW в Windows? Большое спасибо

1 Ответ

1 голос
/ 25 января 2020

Тот же ответ, что и для Как правильно определить и связать деструктор класса C ++ с главным файлом?

У меня была такая же проблема, как и у вас. Попробуйте переместить определение вашего конструктора и деструктора из cpp в заголовочный файл. Таким образом, связывание хорошо выполняется только с помощью простой команды g ++, которую вы упомянули, для этого вам не нужен Makefile. Включения указывают вашему компилятору, где найти определения.

Попробуйте:

MyClass(const string& className){ _className=className };

Если определение находится внутри файла cpp, я получаю ту же ошибку, что и вы.

...