Russian Qt Forum

Qt => Общие вопросы => Тема начата: Torvald от Ноябрь 24, 2018, 18:46



Название: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 24, 2018, 18:46
Есть пустой widgets проект с собственным классом Time:
Код
C++ (Qt)
#ifndef TIME_H
#define TIME_H
 
#include <QElapsedTimer>
 
class Time
{
static QElapsedTimer timer;
static qint64 startTime;
static float _time;
static qint64 _frames;
static float _fps;
static float _delta;
static float _avrDelta;
 
public:
Time() = delete;
 
static void tic();
 
inline static qint64 frames() { return _frames; }
inline static float fps() { return _fps; }
inline static float time() { return _time; }
inline static float delta() { return _delta; }
inline static float avrDelta() { return _avrDelta; }
};
 
#endif // TIME_H
 

В Qt 5.10 получается конфликт библиотек, а именно в файле <ctime>, который есть в chrono, который есть в qobject.

в ctime подключается хедер #include <time.h>, который почему то ссылается на мой хедер time.h, хотя угловые скобки должны в первую очередь искать в глобальной области видимости. Как с этим бороться? Очевидно, можно переименовать свой класс или поместить хедер в подпапку, но хочется разобраться, ведь так быть не должно.


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: qate от Ноябрь 24, 2018, 19:23
TIME_H меня сразу напрягает, pragma once ?


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 25, 2018, 04:52
TIME_H меня сразу напрягает, pragma once ?

Нет, это не помогло. По сути pragma once никак не влияет на очередность поиска хедера для включения. Тут проблема именно в том, что #include <time.h> по какой то причине ссылается именно на мой (локальный) файл, вместо системного (глобального).


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: lit-uriy от Ноябрь 25, 2018, 06:31
>>искать в глобальной области видимости
А что это такое для С++ компилятора?

Компиляция выглядит так:

g++ -c -g -std=gnu++11 -Wall $(INCPATH) -o myapp.o myapp.cpp

где $(INCPATH) - список путей поиска такого вида:

-I..\..\..\programs\Qt-5.7.1\5.7\mingw53_32\include\QtCore  -I..\..\..\programs\Qt-5.7.1\5.7\mingw53_32\include\QtSvg

т.е. никакой глобальной области видимости нет


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 25, 2018, 16:16
Под глобальной областью я подразумеваю системные библиотеки, которые идут вместе с компилятором и пути к которым не требуется явно указывать при компиляции. time.h - одна из них. Сейчас проверил - так оно и есть. По идеи должно работать так:
#include <time.h> - подключается системная библиотека
#include "time.h" - подключается моя библиотека из проекта

Если я ошибаюсь, то в чем разница между скобками и кавычками?

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 25, 2018, 16:28
Сделал минимальный проект с демонстрацией


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Авварон от Ноябрь 25, 2018, 18:11
Если я ошибаюсь, то в чем разница между скобками и кавычками?

АФАИК "" сперва ищут в текущей фапке, а <> сразу в include_paths, но это не точно.


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 25, 2018, 18:25
Если я ошибаюсь, то в чем разница между скобками и кавычками?

АФАИК "" сперва ищут в текущей фапке, а <> сразу в include_paths, но это не точно.

Вот да, а тут получается, что <> берет сразу из текущей папки. Не порядок)


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Авварон от Ноябрь 25, 2018, 20:00
Если я ошибаюсь, то в чем разница между скобками и кавычками?

АФАИК "" сперва ищут в текущей фапке, а <> сразу в include_paths, но это не точно.

Вот да, а тут получается, что <> берет сразу из текущей папки. Не порядок)

так может у вас она прописана как инклюдпатх?


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 25, 2018, 20:14
Не знаю, как получить список путей в инклудпатх? time.h не нуждается в явном указании компилятору, т.к. является системной библиотекой. Но в любом случае, если она там есть, <time.h> должен брать именно ее, а не локальную. И даже если ее там нет, все равно должен брать системную.

Вот вывод консоли сборки:

g++ -c -fno-keep-inline-dllexport -O2 -std=gnu++11 -Wextra -Wall -W -fexceptions -mthreads -DUNICODE -D_UNICODE -I..\TimeCollision -I. -IC:\Qt\5.10.0\mingw53_32\mkspecs\win32-g++  -o release\main.o ..\TimeCollision\main.cpp
..\TimeCollision\main.cpp: In function 'int main()':
..\TimeCollision\main.cpp:12:26: error: 'clock' was not declared in this scope
  cout << "Time" << clock();


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Авварон от Ноябрь 25, 2018, 20:59
Ну вот же на втором месте стоит  -I.
А значит приоритет выше чем у встроенных (слева направо, встроенный условно в самом конце)


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 25, 2018, 21:09
Не совсем понял, в -I. находятся мои инклуды, так? А системные сами подключаются в самом конце? Но раз так, то зачем вообще нужны скобки и кавычки, если системные библиотеки в любом случае имеют самый низкий приоритет подключения?


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Igors от Ноябрь 26, 2018, 05:47
Есть пустой widgets проект с собственным классом Time:
Код
C++ (Qt)
#ifndef TIME_H
#define TIME_H
 
А какого <template> надо было искать приключений и давать такое вызывающее имя классу и особенно файлу? И вообше, где префикс "мой класс"? Напр в Qt это "Q" - но это не Qt придумали. Уговорить можно напр так
Код:
#include "MyDir/time.h"
Но лучше наладить нормальную систему имен.


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Авварон от Ноябрь 26, 2018, 12:25
Не совсем понял, в -I. находятся мои инклуды, так? А системные сами подключаются в самом конце? Но раз так, то зачем вообще нужны скобки и кавычки, если системные библиотеки в любом случае имеют самый низкий приоритет подключения?

Не то, чтобы самый низкий, просто вы искусственно расширили область видимости <> до "" передав "-I.". С такими флагами между ними разницы нет, да.
Если убрать "-I." то разница будет - <> не будет искать в текущей папке.
Можно попробовать добавить явно -I/usr/include в начале и посмотреть, что будет.


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Torvald от Ноябрь 26, 2018, 13:31
Ааа, теперь понятно. Это вроде как в Qt Creator уже не изменить. Спасибо, разобрался)


Название: Re: Конфликт локальной и глобальной библиотеки
Отправлено: Авварон от Ноябрь 26, 2018, 16:21
Ааа, теперь понятно. Это вроде как в Qt Creator уже не изменить. Спасибо, разобрался)

Да, возможно, это qmake автоматом передает, я сталкивался с похожей проблемой с флагами предупреждений (-Wall который передавался последним, в результате чего для clang'а отключал все -Wno-* переданные перед ним)