Ошибки при компиляции приложения в Qt Creator Ubuntu

517
31 августа 2017, 20:33

Пример вывода ниже:

20:09:46: Выполняются этапы для проекта QFile...
20:09:46: Запускается: «/usr/bin/make» clean
rm -f moc_mainwindow.cpp moc_dialog.cpp
rm -f ui_mainwindow.h ui_dialog.h
rm -f main.o mainwindow.o dialog.o moc_mainwindow.o moc_dialog.o
rm -f *~ core *.core
20:09:46: Процесс «/usr/bin/make» завершился успешно.
20:09:46: Настройки не изменились, этап qmake пропускается.
20:09:46: Запускается: «/usr/bin/make» 
/opt/Qt5.7.0/5.7/gcc_64/bin/uic ../QFile/mainwindow.ui -o ui_mainwindow.h
/opt/Qt5.7.0/5.7/gcc_64/bin/uic ../QFile/dialog.ui -o ui_dialog.h
g++ -c -pipe -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG    -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../QFile -I. -I/opt/Qt5.7.0/5.7/gcc_64/include -I/opt/Qt5.7.0/5.7/gcc_64/include/QtWidgets -I/opt/Qt5.7.0/5.7/gcc_64/include/QtGui -I/opt/Qt5.7.0/5.7/gcc_64/include/QtCore -I. -I. -I/opt/Qt5.7.0/5.7/gcc_64/mkspecs/linux-g++ -o main.o ../QFile/main.cpp
g++ -c -pipe -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../QFile -I. -I/opt/Qt5.7.0/5.7/gcc_64/include -I/opt/Qt5.7.0/5.7/gcc_64/include/QtWidgets -I/opt/Qt5.7.0/5.7/gcc_64/include/QtGui -I/opt/Qt5.7.0/5.7/gcc_64/include/QtCore -I. -I. -I/opt/Qt5.7.0/5.7/gcc_64/mkspecs/linux-g++ -o mainwindow.o ../QFile/mainwindow.cpp
In file included from ../QFile/mainwindow.cpp:4:0:
./QFile:1:1: error: stray '\177' in program
ELF         >    �9@     @       0I         @ 8   @ ( %       @       @ @     @ @     �      �                   8      8@     8@                                          @       @     ��      ��                    ��      ��`     ��`                                 Ѝ      Ѝ`     Ѝ`                                T      T@     T@     D       D              P�td   �o      �o@     �o@     $      $             Q�td                                                  R�td   ��      ��`     ��`                        /lib64/ld-linux-x86-64.so.2          GNU                        GNU ���y�Þ�_1�6������}I   �         ��  @ �   �   �   ���|CE���qX������                        �                     q                      2                     �                     ?                     "                     �                                          �                     \                     �                     �                     \                                          W
 ^
./QFile:1:1: error: stray '\2' in program
./QFile:1:1: error: stray '\1' in program
./QFile:1:1: error: stray '\1' in program
./QFile:1:1: error: stray '\3' in program
./QFile:1:9: warning: null character(s) ignored
 ELF         >    �9@     @       0I         @ 8   @ ( %       @       @ @     @ @     �      �                   8      8@     8@                                          @       @     ��      ��                    ��      ��`     ��`                                 Ѝ      Ѝ`     Ѝ`                                T      T@     T@     D       D              P�td   �o      �o@     �o@     $      $             Q�td                                                  R�td   ��      ��`     ��`                        /lib64/ld-linux-x86-64.so.2          GNU                        GNU ���y�Þ�_1�6������}I   �         ��  @ �   �   �   ���|CE���qX������                        �                     q                      2                     �                     ?                     "                     �                                          �                     \                     �                     �                     \                                          W
^
./QFile:1:1: error: stray '\2' in program
 ELF         >    �9@     @       0I         @ 8   @ ( %       @       @ @     @ @     �      �                   8      8@     8@                                          @       @     ��      ��                    ��      ��`     ��`                                 Ѝ      Ѝ`     Ѝ`                                T      T@     T@     D       D              P�td   �o      �o@     �o@     $      $             Q�td                                                  R�td   ��      ��`     ��`                        /lib64/ld-linux-x86-64.so.2          GNU                        GNU ���y�Þ�_1�6������}I   �         ��  @ �   �   �   ���|CE���qX������                        �                     q                      2                     �                     ?                     "                     �                                          �                     \                     �                     �                     \                                          W
^
./QFile:1:18: warning: null character(s) ignored
ELF         >    �9@     @       0I         @ 8   @ ( %       @       @ @     @ @     �      �                   8      8@     8@                                          @       @     ��      ��                    ��      ��`     ��`                                 Ѝ      Ѝ`     Ѝ`                                T      T@     T@     D       D              P�td   �o      �o@     �o@     $      $             Q�td                                                  R�td   ��      ��`     ��`                        /lib64/ld-linux-x86-64.so.2          GNU                        GNU ���y�Þ�_1�6������}I   �         ��  @ �   �   �   ���|CE���qX������                        �                     q                      2                     �                     ?                     "                     �                                          �                     \                     �                     �                     \                                          W
^
./QFile:1:20: warning: null character(s) ignored
 ELF         >    �9@     @       0I         @ 8   @ ( %       @       @ @     @ @     �      �                   8      8@     8@                                          @       @     ��      ��                    ��      ��`     ��`                                 Ѝ      Ѝ`     Ѝ`                                T      T@     T@     D       D              P�td   �o      �o@     �o@     $      $             Q�td                                                  R�td   ��      ��`     ��`                        /lib64/ld-linux-x86-64.so.2          GNU                        GNU ���y�Þ�_1�6������}I   �         ��  @ �   �   �   ���|CE���qX������                        �                     q                      2                     �                     ?                     "                     �                                          �                     \                     �                     �                     \                                          W
^
./QFile:1:1: error: stray '\1' in program
 ELF         >    �9@     @       0I         @ 8   @ ( %       @       @ @     @ @     �      �                   8      8@     8@                                          @       @     ��      ��                    ��      ��`     ��`                                 Ѝ      Ѝ`     Ѝ`                                T      T@     T@     D       D              P�td   �o      �o@     �o@     $      $             Q�td                                                  R�td   ��      ��`     ��`                        /lib64/ld-linux-x86-64.so.2          GNU                        GNU ���y�Þ�_1�6������}I   �         ��  @ �   �   �   ���|CE���qX������                        �                     q                      2                     �                     ?                     "                     �                                          �                     \                     �                     �                     \                                          W
 ^

Также код самого файла, на который ссылается компилятор:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QFile>
#include <QDir>
#include <QTextStream>
#include "dialog.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setCentralWidget(ui->textEdit);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_actionRead_triggered()
{
    Dialog *wnd=new Dialog(this);
    wnd->show();
    connect(wnd, SIGNAL(FilePath(QString)), this,  SLOT(ReadToFile(QString)));
}
void MainWindow::ReadToFile(const QString &filePath)
{
    QFile mFile(filePath);
    if(mFile.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::information(this, "Error", "Path isn't correct");
        return;
    }
    QTextStream stream(&mFile);
    QString buffer=stream.readAll();
ui->textEdit->setText(buffer);
}

До этого собирал на семерке и ничего подобного не встречал. Спасибо за помощь.

Answer 1

Кратко

Проблема возникает из-за совпадения имени проекта (QFile) с именем одного из заголовочных файлов, идущих в комплекте с Qt. Для устранения конфликта переименуйте проект, либо (на правах костыля) выполните очистку сборочного окружения (Сборка → Очистить).

Подробно

Первое, что бросается в глаза — это обилие ошибок компиляции вида «stray '...' in program». Оно означает, что в тексте программы была встречена последовательность недопустимых символов (к допустимым относятся латинские буквы, цифры и знаки препинания, иными словами, вся ISO 8859-5). Как правило, это происходит из-за использования юникодовых символов.

Однако следующая же строка ошибки показывает, что это не тот случай:

ELF         >    �9@     @       0I         @ 8   @ ( %       @       @ @     @ @     �      �                   8      8@     8@                                          @       @     ��      ��                    ��      ��`     ��`                                 Ѝ      Ѝ`     Ѝ`                                T      T@     T@     D       D              P�td   �o      �o@     �o@     $      $             Q�td                                                  R�td   ��      ��`     ��`                        /lib64/ld-linux-x86-64.so.2          GNU                        GNU ���y�Þ�_1�6������}I   �         ��  @ �   �   �   ���|CE���qX������                        �                     q                      2                     �                     ?                     "                     �                                          �                     \                     �                     �                     \                                          W

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

Как он вообще сюда затесался? Неужели при обработке CMakeList.txt произошёл сбой, и CMake повторно натравил на объектный файл компилятор вместо компоновщика? Ниже ничего интересного нет, так что идём вверх:

In file included from ../QFile/mainwindow.cpp:4:0:

Так, CMake здесь не при чём, с заголовочными (раз include-им) файлами он не работает. Смотрим, как именно производится включение в четвёртой строке файла mainwindow.cpp:

#include <QFile>

Обращаем внимание, что имя подключаемого файла подозрительно совпадает с именем проекта. Это должно насторожить, потому что Qt именует выходной исполняемый файл (помним про начальное ELF) по имени проекта, плюс в Linux-е исполняемые файлы традиционно не имеют расширений.

Для подтверждения гипотезы о конфликте имён смотрим, где компилятор выполняет поиск заголовочных файлов, благо в журнале сборки любезно предоставлены все ключи компиляции:

g++ -c -pipe -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../QFile -I. -I/opt/Qt5.7.0/5.7/gcc_64/include -I/opt/Qt5.7.0/5.7/gcc_64/include/QtWidgets -I/opt/Qt5.7.0/5.7/gcc_64/include/QtGui -I/opt/Qt5.7.0/5.7/gcc_64/include/QtCore -I. -I. -I/opt/Qt5.7.0/5.7/gcc_64/mkspecs/linux-g++ -o mainwindow.o ../QFile/mainwindow.cpp

Нас интересуют все вхождения ключа -I, указывающего места поиска заголовочных файлов. При этом поиск производится в том порядке, в котором эти пути были перечислены:

  1. ../QFile
  2. .
  3. /opt/Qt5.7.0/5.7/gcc_64/include
  4. /opt/Qt5.7.0/5.7/gcc_64/include/QtWidgets
  5. /opt/Qt5.7.0/5.7/gcc_64/include/QtGui
  6. /opt/Qt5.7.0/5.7/gcc_64/include/QtCore
  7. .
  8. .
  9. /opt/Qt5.7.0/5.7/gcc_64/mkspecs/linux-g++

Итак, что делает компилятор при встрече строки #include <QFile>:

  1. Берёт первый путь в списке (../QFile).
  2. Пытается открыть файл ../QFile/QFile.
  3. Так как CMake устанавливает текущей корневую директорию для сборки (чьё имя устанавливается в имя проекта), то ../QFile эквивалентно ., то есть текущей корневой директории сборки. По счастливой случайности, именно сюда CMake кладёт итоговый исполняемый файл.
  4. Если указанный файл существует, то компилятор останавливает поиск и берёт именно его.
  5. Однако этот файл является «хвостом» от предыдущей сборки. Соответственно, если сборка производится в чистом окружении, то компилятор не находит файла ../QFile/QFile, и идёт по списку дальше, пока не дойдёт до /opt/Qt5.7.0/5.7/gcc_64/include/QtCore, где и лежит правильный заголовочный файл.
READ ALSO
Работа с SendMessage - C++ WinAPI

Работа с SendMessage - C++ WinAPI

Как отобразить в sendmessage координаты курсора(рабочей области окна) и на каком пункте меню находится курсор в данный момент?

383
Реализация boost::any

Реализация boost::any

Необходимо сделать базовую реализацию boost::anyГлавное условие: чтобы можно было свободно хранить в контейнерах разные типы

316
strip: Формат файла не распознан

strip: Формат файла не распознан

Столкнулся с ошибкой после выполнения команды make install в окружении cygwin при установке библиотеки:

257
Печать QTableView с сохранением форматирования

Печать QTableView с сохранением форматирования

Есть QTableView, соединенная с QSqlTableModel, у это таблицы также есть делегаты и прокси модельВозможно ли вывести данную таблицу на печать с сохранением...

310