170 похожих чатов

Всем привет! Все библиотеки на Linux Mint устанавливаются в отдельные

папки и поэтому все пути этой библиотеки ломаются. Например:

По мнению библиотеки путь к заголовочному файлу QtWebEngine = QtWebEngine/QtWebEngine , на самом деле путь qt5/QtWebEngine/QtWebEngine . И так со всеми заголовочными файлами (они все пытаются найти QtWebEngine игнорируя папку qt5 , поэтому все зависимости ломаются при подключении библиотеки


Я решал это достаточно просто, я создавал ссылку на необходимую папку (например, QtWebEngine) в папке с include-ами. Теперь все заголовочные файлы, при поиске QtWebEngine, не приходилось заходить сначала в qt5. Но сильно сомневаюсь, что это правильный способ.

Почему, все библиотеки устанавливаются в отдельную qt5 папку (или другие папки в зависимости от библиотеки), но при этом сами не знают о её существовании?

51 ответов

128 просмотров

патаму что надо cmake юать

Это зависит от дистрибьютеров Mint, у них спрашивай. Это если ты из пакета ставил

вроде бы на дебиане и дистров на его основе qt идет отдельными пакетами, все компоненты. А какая тебе разница, в cmake её просто через find_pkg нашёл и все, такой проблемы не встречал

Андрей, заголовки Qt должны подключаться в приложении как-то так: #include <QString> #include <QMessageBox> в таком раскладе пути ко всем модулям Qt должны быть прописаны в параметрах компилятора -I(NCLUDE) и тебе должно быть вообще всё равно, где эти файлы лежат в файловой системе.

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
вроде бы на дебиане и дистров на его основе qt иде...

С компиляцией проблем нету, я могу компилировать через pkg-config прямо в консоли, но при отладке и ловле ошибок, нужно либо каждую папку в отдельности проставлять в settings.json ( у меня clangd ) либо засорить вусмерть переменную PATH. Вообще, меня прежде всего просто интересует вопрос, почему когда другие подключают библиотеку, у них нету никаких ошибок, а у меня каждый пакет в отдельной папке?) Это было бы удобно, если бы сами библиотеки знали, где искать свои же заголовочные файлы.

Андрей- Автор вопроса

Mint основан на Ubuntu и насколько я помню, использует его репозитории. Но даже в Ubuntu, каким образом этот дистрибутив определяет, какие папки к какой версии библиотеки относится? Например, у меня qt5 и qt6 , получается, он не сможет их обе установить?

Андрей- Автор вопроса
Ilya Zviagin
Андрей, заголовки Qt должны подключаться в приложе...

Компиляция, никогда не предоставляла проблем. Но вот отладка и работа в редакторе VS Code, наверное, практически с каждой библиотекой вызывает подобные непонятицы. Ибо по какой-то для меня странной причине, они не добавили поддержку pkg-config даже в своё официальное расширение C/C++ , чтобы можно было легко проставлять пути, как при компиляции. Вообще, меня просто волнует, что у всех всё работает, а у меня нет)

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
они не просто так qt5 и qt6 называются 🌚

Но у них часто могут папки совпадать и условный QtWebEngine скорее всего, будет сливаться в папке include при установке двух разных версий

Андрей
С компиляцией проблем нету, я могу компилировать ч...

Так и должно быть, каждый пакет (модуль Qt) в отдельной папке. Если тебе там что-то неудобно - терпи, Qt большая библиотека, с ней иногда сложновато.

Ilya Zviagin
Так и должно быть, каждый пакет (модуль Qt) в отде...

в общем он не разобрался с vscode и у него подсветка ругалась на qt, мол нет таких методов и классов. Проблема не в библиотеках, а в настройке вскода

Андрей- Автор вопроса
Ilya Zviagin
Так и должно быть, каждый пакет (модуль Qt) в отде...

То, что каждый модуль в отдельной библиотеке, абсолютно нормально. Не нормально то, что сама библиотека, со всеми модулями в отдельной папке, из-за чего заголовочные не знают, где они находятся и где искать зависимости (другие заголовочные файлы). Поэтому я не могу просто написать, как все QtWebEngine/QtWebEngine при подключении библиотеки и даже если я укажу полный путь qt5/QtWebEngine/QtWebEngine, то библиотеки, которые ищут свои зависимости в папке include не будут находить их, поскольку вся библиотека находится в папке qt5. При этом у других людей всё нормально. И ладно бы только qt, но почти все include-ы (заголовочные файлы) находится в отдельнй папке из-за чего VS Code в душе не знает, где искать любые из тех библиотек, которые я устанавл.иваю через apt и приходится либо устанавливать пути отдельно, либо создавать ссылки на эти папки в месте поиска (в папке include). Например, я могу создать ссылку на папку QtWebEngine в папке include и теперь всё работает. Но это вообще странно С компиляцией же всё отлично, pkg-config до фонаря, где они расположены, главное чтобы путь был в .pc

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
в общем он не разобрался с vscode и у него подсвет...

Нет, именно в них. Они устанавливают свои заголовочные файлы (include-ы) в отдельную папку, но сами же не знают, что это делают, по этой причине они теряются. Поскольку ищут заголовочные файлы в папке usr/include , а они в usr/include/qt5

Андрей
Нет, именно в них. Они устанавливают свои заголово...

у тебя подсветка не знает, что это за либы. И ничего более. Тебе просто нужно конфиг для неё указать, который генерирует cmake, его вручную не надо делать

Андрей
То, что каждый модуль в отдельной библиотеке, абсо...

А в чём проблема в том же cmake настроить target_include_directory(main /usr/include/qt5)?

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
у тебя подсветка не знает, что это за либы. И ниче...

Но почему они устанавливаются в отдельную папку и сами же не в курсе, что это делают? В этом и был вопрос

Андрей
Но почему они устанавливаются в отдельную папку и ...

vscode кроссплатформенная штука, он не может знать закидоны всех дистрибутивов линукса, виндовс и мака

Aniki Hi$ok@ 🌈 Z 🐀
vscode кроссплатформенная штука, он не может знать...

ты просто не разобрался как его настроить нормально. А эти гайды есть в гугле, просто нужно запрос составить. В clion все прекрасно работает, в qtcreator тоже, в eclipse. Это вообще чудо, что редактор может с плюсами работать, на уровне иде

Ну вполне логично Вдруг у тебя в qt5 и boost будет папка Pointers? Если все эти библиотеки будут хранить свои внутренности в /usr/include, то это прямой путь к 10 часам весёлой отладки хД

Rekreker
Ну вполне логично Вдруг у тебя в qt5 и boost будет...

отладки линковки, а это самая сладкая отладка из всех

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
vscode кроссплатформенная штука, он не может знать...

Я походу, просто плохо объясняю. Не VS Code , а сами заголовочные файлы теряются. Они ищут себя в переменной PATH. Например, QtWebView/QtWebView в переменной PATH (и так с большинством других библиотек), но нет, библиотека ищет другие заголовочные файлы в папке QtWebView , но они в qt5/QtWebView. Я об этом

Андрей
То, что каждый модуль в отдельной библиотеке, абсо...

что-то ерунда какая-то, ересь, такая что я даже не понимаю о чём это.

Андрей
Я походу, просто плохо объясняю. Не VS Code , а са...

ты врёшь, cmake прекрасно в рамках проекта все хидеры инклудит, переменные среды тут не причём

Андрей
То, что каждый модуль в отдельной библиотеке, абсо...

что сама библиотека, со всеми модулями в отдельной папке, из-за чего заголовочные не знают, где они находятся и где искать зависимости (другие заголовочные файлы) - это бессмыслица. Все пути к базовым каталогам заголовочных файлов должны быть указаны в параметрах -I и компилятор будет знать где их брать. Весь секрет.

Андрей
Я походу, просто плохо объясняю. Не VS Code , а са...

Они НЕ ИЩУТ себя в переменной PATH, эта переменная никак с компиляцией воообще не связана. Они должны (могут) искать себя в другой переменной, INCLUDE, которая иногда может работать.

Андрей
Я походу, просто плохо объясняю. Не VS Code , а са...

Пришли два полных пути к двум разным модулям (к их заголовочным файлам) Qt у тебя на машине. Например, QtCore и QtWidgets

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
ты просто не разобрался как его настроить нормальн...

Дам пример. Вот к примеру я подключаю заголовочный файл. Я использую библиотеку установленную через apt. #include<qt5/QtWebEngine/QtWebEngine> - Этот заголовочный файл он нашёл, всё нормально. Но, для работы заголовочного файла QtWebEngine , нужен заголовочный файл QtWebEngineDepends . Где он будет его искать? Правильно, в переменной PATH в удобнейшей файловой системе Linux. #include <QtWebEngine/QtWebEngineDepends> - Строка внутри файла QtWebEngine. Он ищет папку QtWebEngine в переменной PATH. Но , он ведь не в QtWebEngine/QtWebEngineDepends , а в qt5/QtWebEngine/QtWebEngineDepends . И поэтому, получается ошибка "А где ваша QtWebEngineDepends? Нету её" Т. Е. в чём дело. Я, устанавливаю библиотеку через apt и он установил её заголовочные файлы в папку /usr/include/qt5 , но сама библиотека считает, что она находится в /usr/include/ И так почти со всеми библиотеками. Вопрос: Почему библиотека устанавливается "туда, не знаю куда"? Почему она устанавливается в папку qt5 и сама об этом не в курсе? Исправить это не сложно. Проставить пути вручную, сгенерировать json файл при помощи cmake, создать в папке usr/include ссылку на папку QtWebEngine , но почему так получается? Почему библиотека устанавливается "сама хз куда"? И как сделать, чтобы она устанавливалась не "куда хочу", а "куда нужно"? В идеале у других на Linux, просто запускаешь IDE и всё работает без cmake или других манипуляций. Просто установил библиотеку через apt , подключил её через #include и не вспоминаешь о ней до компиляции, всё благодаря удобной и унифицированной файловой системе Linux. Почему у всех работает, а у меня нет?) Может есть пакетный менеджер или особый репозиторий, которые будет устанавливать все библиотеки правильно ?

Андрей- Автор вопроса
Ilya Zviagin
что-то ерунда какая-то, ересь, такая что я даже не...

Я ниже всё очень подробно и с примером описал

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
ты врёшь, cmake прекрасно в рамках проекта все хид...

Да, потому, что правильный путь есть в .pc файлах .pc ..

Андрей- Автор вопроса
Ilya Zviagin
что сама библиотека, со всеми модулями в отдельной...

Я могу компилировать без каких либо проблем. Я просто задал вопрос , чтобы докопаться к тому, почему библиотеки в принципе не понимают, куда они устанавливаются. Подробнее выше

Андрей- Автор вопроса
Ilya Zviagin
Они НЕ ИЩУТ себя в переменной PATH, эта переменная...

Я хз, где они себя изут, но не будет она в отдельной папке qt5, они бы себя нашли

Андрей- Автор вопроса
Ilya Zviagin
Пришли два полных пути к двум разным модулям (к их...

Как я уже упоминал, это проблема не только qt. Вне зависимости от расположения, они устанавливаются в папки, которые определены в переменной path linux-а. Но вместо простой установки в папку include или include/x86_64-linux-gnu , они устанавливаются в include/x86_64-linux-gnu/qt5 , а сами себя ищут они в include/x86_64-linux-gnu. Но вот пути. /usr/include/x86_64-linux-gnu/qt5/QtCore /usr/include/x86_64-linux-gnu/qt5/QtWidgets Это то, где они располагаются на моём компютере. А сами они "считают", что располагаются на: /usr/include/x86_64-linux-gnu/QtCore /usr/include/x86_64-linux-gnu/QtWidgets

Андрей
Как я уже упоминал, это проблема не только qt. Вне...

Как выглядят директивы препроцессора include в заголовочных файлах QT? Просто #include <QtCore>, например?

Андрей
Дам пример. Вот к примеру я подключаю заголовочн...

ты шиз, сначала линкуют, а потом уже код пишут, не наоборот. Кто тебе вообще такое показал

Андрей
#include <qt5/QtCore/QtCore>

В c_cpp_properties.json в includePath пробовал добавить "/usr/include/x86_64-linux-gnu/qt5"?

Андрей- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
ты шиз, сначала линкуют, а потом уже код пишут, не...

Спасибо за комплимент, но обычно это работает так. Если библиотеки, которые не расположили свои заголовочные файлы в отдельной папке и они работают так, как надо. Просто зайти в VsCode заинклудить библиотеку и забыть об этом. Но вот большая часть библиотек устанавливают заголовочные файлы в отдельной папке и сами не знают, что это делают. При этом на гайдах в интернете, тоже большинство делают так) Просто устанавливают VsCode , устанавливают библиотеку через apt и используют, больше ничего не нужно, поэтому я не одинок в своей шызе) Линковать же её нужно только для компиляции и с этим отлично справляются CMake и pkg-config.

Андрей- Автор вопроса
Дмитрий 🎮
В c_cpp_properties.json в includePath пробовал доб...

Я использую clangd. Но вообще, как я и говорил, исправить эту проблему не сложно, если для каждой отдельной библиотеки. Меня просто тревожит вопрос. Почему библиотеки устанавливаются в отдельную папку и при этом сами это не учитывают при подключении? Это apt или linux mint или кто?) Почему они пытаются найти заголовочные файлы напрямую в папке x86_64-linux-gnu , но они располагаются в x86_64-linux-gnu/qt5 ? Почему у других работает всё идеально и без проблем, а у меня нет?) В этом вопрос. Исправить эту проблему не сложно, но зачем её каждый раз исправлять, если это может работать лучше? Поскольку у Linux удобная файловая система, библиотеки (за исключением компиляции, именно в самом редакторе) и без указания путей должны знать где искать заголовочные файлы

Андрей
Я использую clangd. Но вообще, как я и говорил, ис...

Попробуй в settings.json добавить "clangd.fallbackFlags": [ "-Ix86_64-linux-gnu/qt5" ] Видимо, для системы есть некоторые пути по-умолчанию, а разработчики Qt или установщик решили поместить файлы дополнительно в папку Qt5. И надо где-то указать дополнительную директорию include.

Андрей- Автор вопроса
Дмитрий 🎮
Попробуй в settings.json добавить "clangd.fallbac...

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

Андрей
Дам пример. Вот к примеру я подключаю заголовочн...

ты не должен подключать заголовочный файл Qt так: #include <qt5/QtWebEngine/QtWebEngine> ДОЛЖЕН ТАК: #include <QtWebEngine> Для этого в -I или переменную INCLUDE ты должен положить путь к /opt/...../qt5/QtWebEngine

ЕЩЁ РАЗ! Переменная PATH никакого отношения к сборке программ на С/С++ не имеет.

Андрей- Автор вопроса
Ilya Zviagin
ЕЩЁ РАЗ! Переменная PATH никакого отношения к сбо...

Каким же образом работают некоторые другие библиотеки? FLTK вообще работает без проблем и мне не нужно указывать никакой -i , просто подключил библиотеку через #include и все работает

Андрей
Каким же образом работают некоторые другие библиот...

Через переменную окружения INCLUDE, возможно

Андрей- Автор вопроса
Ilya Zviagin
Через переменную окружения INCLUDE, возможно

Может быть. Но почему тогда таким же макаром не работает qt и многие другие библиотеки?..

Андрей
Может быть. Но почему тогда таким же макаром не ра...

Во-первых, иногда работает. Во-вторых, переменная INCLUDE не резиновая, и туда всё на свете запихать нельзя, системные библиотеки обычно там, а более менее прикладные, типа Qt , могут там и не быть.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта