Russian Qt Forum
Апрель 26, 2024, 14:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Конфликт локальной и глобальной библиотеки  (Прочитано 7702 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« : Ноябрь 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, хотя угловые скобки должны в первую очередь искать в глобальной области видимости. Как с этим бороться? Очевидно, можно переименовать свой класс или поместить хедер в подпапку, но хочется разобраться, ведь так быть не должно.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #1 : Ноябрь 24, 2018, 19:23 »

TIME_H меня сразу напрягает, pragma once ?
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #2 : Ноябрь 25, 2018, 04:52 »

TIME_H меня сразу напрягает, pragma once ?

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Ноябрь 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

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

Юра.
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #4 : Ноябрь 25, 2018, 16:16 »

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

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

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #5 : Ноябрь 25, 2018, 16:28 »

Сделал минимальный проект с демонстрацией
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #6 : Ноябрь 25, 2018, 18:11 »

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

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

Сообщений: 118


Просмотр профиля
« Ответ #7 : Ноябрь 25, 2018, 18:25 »

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

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

Вот да, а тут получается, что <> берет сразу из текущей папки. Не порядок)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #8 : Ноябрь 25, 2018, 20:00 »

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

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

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

так может у вас она прописана как инклюдпатх?
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #9 : Ноябрь 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();
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #10 : Ноябрь 25, 2018, 20:59 »

Ну вот же на втором месте стоит  -I.
А значит приоритет выше чем у встроенных (слева направо, встроенный условно в самом конце)
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #11 : Ноябрь 25, 2018, 21:09 »

Не совсем понял, в -I. находятся мои инклуды, так? А системные сами подключаются в самом конце? Но раз так, то зачем вообще нужны скобки и кавычки, если системные библиотеки в любом случае имеют самый низкий приоритет подключения?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Ноябрь 26, 2018, 05:47 »

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

Сообщений: 3258


Просмотр профиля
« Ответ #13 : Ноябрь 26, 2018, 12:25 »

Не совсем понял, в -I. находятся мои инклуды, так? А системные сами подключаются в самом конце? Но раз так, то зачем вообще нужны скобки и кавычки, если системные библиотеки в любом случае имеют самый низкий приоритет подключения?

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

Сообщений: 118


Просмотр профиля
« Ответ #14 : Ноябрь 26, 2018, 13:31 »

Ааа, теперь понятно. Это вроде как в Qt Creator уже не изменить. Спасибо, разобрался)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 22.