Другое

Как исправить ошибку ld returned 1 exit status в Qt 6.10.0 static сборке

Решение ошибки линковки collect2.exe в Qt 6.10.0 static сборке. Пошаговые инструкции по исправлению путей библиотек и настройке .pro файла.

Как исправить ошибку “collect2.exe: error: ld returned 1 exit status” в Qt 6.10.0 static сборке?

Я начинаю изучать Qt и столкнулся с проблемой при создании проекта на qmake. В Qt 6.10.0 static сборке появляются две ошибки, в то время как в Qt 6.9.2 shared и Qt 5.5.17 static сборках такой проблемы не возникает. В чём может быть причина?

Файл QT Proj.pro:
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

You can make your code fail to compile if it uses deprecated APIs.

In order to do so, uncomment the following line.

#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES +=
main.cpp
mainwindow.cpp

HEADERS +=
mainwindow.h

FORMS +=
mainwindow.ui

Default rules for deployment.

qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

Файл mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Файл main.cpp:
#include “mainwindow.h”

#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

Файл mainwindow.cpp:
#include “mainwindow.h”
#include “ui_mainwindow.h”

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow))
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

Ошибка “collect2.exe: error: ld returned 1 exit status” является распространенной проблемой при сборке проектов Qt и указывает на сбой в процессе компоновки (линковки). Эта ошибка возникает, когда линкер не может найти необходимые библиотеки или столкнулся с другими проблемами при создании исполняемого файла.

Содержание

Основные причины ошибки

Ошибка collect2.exe: error: ld returned 1 exit status в Qt 6.10.0 static сборке может возникать по нескольким причинам:

  1. Неправильная настройка статической линковки - при static сборке Qt 6.10.0 могут потребоваться дополнительные флаги конфигурации
  2. Проблемы с путями библиотек - линкер не может найти необходимые .lib файлы
  3. Отсутствие необходимых модулей Qt - особенно в новой версии 6.10.0
  4. Несоответствие debug/release версий - попытка смешать разные типы библиотек
  5. Проблемы с правами доступа - как упоминалось в Stack Overflow
  6. Проблемы с путями, содержащими пробелы - особенно актуально для Windows, как указано в Qt Forum

Способы исправления ошибки

Проверка статической сборки

Для static сборки Qt 6.10.0 убедитесь, что ваш .pro файл правильно настроен для статической линковки:

pro
CONFIG += static

Если вы используете плагины, добавьте:

pro
CONFIG += static_plugins

Проверьте, что вы используете правильные версии библиотек. В Qt 6.10.0 static сборке библиотеки имеют суффикс _static:

-lQt6CoreStatic
-lQt6GuiStatic
-lQt6WidgetsStatic

Исправление путей библиотек

Добавьте правильные пути к статическим библиотекам в .pro файл:

pro
# Пути к статическим библиотекам Qt 6.10.0
LIBS += -L"C:/Qt/6.10.0/mingw_64/lib"

Убедитесь, что пути не содержат пробелов, или заключите их в кавычки:

pro
# Для путей с пробелами
LIBS += -L"C:/Program Files/Qt/6.10.0/mingw_64/lib"

Настройка .pro файла

Улучшите ваш .pro файл для static сборки Qt 6.10.0:

pro
QT += core gui widgets

CONFIG += c++17 static

# Определения для static сборки
DEFINES += QT_STATIC_BUILD

# Пути к библиотекам (замените на ваши реальные пути)
win32 {
    LIBS += -L"C:/Qt/6.10.0/mingw_64/lib"
    LIBS += -lQt6CoreStatic -lQt6GuiStatic -lQt6WidgetsStatic
}

# Настройки развертывания
unix:!macx {
    LIBS += -lpthread -ldl
}

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
else: win32: target.path = $$OUT_PWD/../bin
!isEmpty(target.path): INSTALLS += target

Проверка зависимостей

Проверьте, что все необходимые зависимости установлены и доступны:

  1. Проверьте наличие всех .lib файлов в каталоге lib Qt 6.10.0
  2. Убедитесь в правильности версий debug/release библиотек
  3. Проверьте зависимости сторонних библиотек, как упоминалось в Stack Overflow

Если вы используете OpenGL или другие модули, добавьте их в .pro файл:

pro
QT += opengl

Другие возможные решения

  1. Закройте запущенные экземпляры вашего приложения перед перекомпиляцией, как упоминалось в Stack Overflow

  2. Проверьте права доступа к файлам библиотек

  3. Очистите проект и пересоберите:

    • В Qt Creator: Build → Clean Project
    • Затем Build → Rebuild Project
  4. Проверьте конфигурацию Kit в Qt Creator:

    • Убедитесь, что выбран правильный компилятор
    • Проверьте пути в настройках компилятора
  5. Проверьте переменные окружения:

    bash
    echo %PATH%
    echo %LIB%
    

Диагностика проблемы

Для точной диагностики выполните следующие шаги:

  1. Проверьте полный лог компиляции - ищите сообщения об отсутствующих библиотеках

  2. Используйте verbose режим сборки:

    bash
    qmake -spec win32-g++ -v
    make verbose=1
    
  3. Проверьте наличие всех необходимых библиотек:

    • Qt6Core.lib
    • Qt6Gui.lib
    • Qt6Widgets.lib
    • и другие зависимости
  4. Сравните с рабочей конфигурацией Qt 6.9.2 - какие отличия в настройках?

  5. Проверьте документацию Qt 6.10.0 на предмет изменений в static сборке, как упоминалось в Qt Forum.

Заключение

Ошибка collect2.exe: error: ld returned 1 exit status в Qt 6.10.0 static сборке обычно связана с:

  1. Неправильной настройкой статической линковки - добавьте CONFIG += static и используйте правильные имена библиотек
  2. Проблемами с путями библиотек - проверьте корректность путей к .lib файлам
  3. Отсутствием необходимых модулей - убедитесь, что все используемые модули Qt правильно подключены
  4. Конфликтами версий - проверьте соответствие debug/release версий

Рекомендуется начать с проверки базовой настройки .pro файла для static сборки, затем逐步 добавлять необходимые модули и зависимости. Если проблема сохраняется, проверьте полные логи компиляции для более точной диагностики.

Источники

  1. What does “collect2: ld returned 1 exit status” mean? | Qt Forum
  2. QtCreator build returns collect2: ld returned exit status 1 - Stack Overflow
  3. Collect2.exe:-1: error: error: ld returned 1 exit status [SOLVED] | Qt Forum
  4. collect2: error: ld returned 1 exit status | Qt Centre
  5. Qt error cannot find -lQtCored collect2: ld returned … - Stack Overflow
  6. How to solve the error of collect2: ld returned 1 exit status - Stack Overflow
  7. Error collect2: ld returned 1 exit status with QT and opengl - Stack Overflow
  8. Can’t build any projet I get collect2:error:ld returned 1 exit status | Qt Forum
  9. Unable to get compiled code running due to “collect2: ld returned 1 exit status.” error - Stack Overflow
  10. Build Issue in Qt Creator: collect2: ld returned 1 exit status - Qt Creator Mailing List
Авторы
Проверено модерацией
Модерация