Название: Конфликт локальной и глобальной библиотеки Отправлено: Torvald от Ноября 24, 2018, 18:46 Есть пустой widgets проект с собственным классом Time:
Код
В 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: А какого <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-* переданные перед ним) |