Пример вывода ниже:
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);
}
До этого собирал на семерке и ничего подобного не встречал. Спасибо за помощь.
Проблема возникает из-за совпадения имени проекта (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
, указывающего места поиска заголовочных файлов. При этом поиск производится в том порядке, в котором эти пути были перечислены:
Итак, что делает компилятор при встрече строки #include <QFile>
:
../QFile
).../QFile/QFile
.../QFile
эквивалентно .
, то есть текущей корневой директории сборки. По счастливой случайности, именно сюда CMake кладёт итоговый исполняемый файл.../QFile/QFile
, и идёт по списку дальше, пока не дойдёт до /opt/Qt5.7.0/5.7/gcc_64/include/QtCore
, где и лежит правильный заголовочный файл.Виртуальный выделенный сервер (VDS) становится отличным выбором
Как отобразить в sendmessage координаты курсора(рабочей области окна) и на каком пункте меню находится курсор в данный момент?
Необходимо сделать базовую реализацию boost::anyГлавное условие: чтобы можно было свободно хранить в контейнерах разные типы
Столкнулся с ошибкой после выполнения команды make install в окружении cygwin при установке библиотеки:
Есть QTableView, соединенная с QSqlTableModel, у это таблицы также есть делегаты и прокси модельВозможно ли вывести данную таблицу на печать с сохранением...