Стандарт компилятора CMake включает

Пытаюсь понять, как работает cmake.

Я работаю над Mac с менеджером пакетов homebrew. Я установил libpng с помощью homebrew. Путь к заголовку include находится в / usr / local / include, который также является стандартным путем заголовка include для C++, g ++, clang.

Если я сделаю, например, что-то вроде этого:

...
find_package(PNG)
target_link_libraries(mytarget PNG::PNG)
...

заголовки автоматически находит компилятор, даже если я выброшу find_package (PNG). Cmake просто знает, что png.h, на который я ссылаюсь в своем файле cpp, находится в / usr / local / include.

Но по какой-то причине, если я создам свою собственную библиотеку, а затем установлю ее в / usr / local / lib и / usr / local / include, а затем напишу код find_library, find_path, чтобы найти заголовки и библиотеки этой моей новой свежеиспеченной библиотеки, это не находит мой заголовок mylib.h, на который также есть ссылка в моем файле cpp. Ошибка в том, что mylib.h не найден.

Как cmake обрабатывает хорошо знакомые пакеты, такие как PNG, Eigen, Boost и т. д., Чтобы автоматически находить заголовки?

Как cmake обрабатывает хорошо знакомые пакеты, такие как PNG, Есть модуль поиска для PNG.
drescherjm 07.09.2018 15:28

Думаю, вам стоит прочитать документацию для find_package: cmake.org/cmake/help/latest/command/find_package.html

drescherjm 07.09.2018 15:29
если я создам свою собственную библиотеку, а затем установлю ее в / usr / local / lib и / usr / local / include, а затем напишу код find_library, find_path, чтобы найти заголовки и библиотеки этой моей новой запеченной библиотеки, она не найдет мою заголовок mylib.h Вы создали свой проект для своей библиотеки с помощью CMake. Если вы этого не сделаете, вам нужно создать модуль поиска для вашей библиотеки.
drescherjm 07.09.2018 15:36

Да, библиотека создается с помощью cmake. Дело в том, что мой вопрос меньше связан с find_package. Почему cmake просто включает заголовки для известных библиотек, таких как eigen, boost и png, но не включает заголовки для моей библиотеки в компилятор? У них один путь! У меня проблемы с cmake? ^^

ptiza_v_nebe 07.09.2018 15:36

Это имеет прямое отношение к find_package, поскольку именно так CMake находит пакет.

drescherjm 07.09.2018 15:37

Но если я закомментирую, например, find_package (PNG), он все равно найдет заголовки. Хорошо, он жалуется на отсутствующие символы, но это, конечно, потому, что find_package ничего не установил. Если я сделаю то же самое со своей библиотекой, в первой строке будет отображаться сообщение об отсутствии заголовков mylib.h

ptiza_v_nebe 07.09.2018 15:40
Да, библиотека создается с помощью cmake. У вас должен быть libnameconfig.cmake в вашей двоичной папке, в которой вы создали свою библиотеку. CMake нужно найти этот файл. Вы можете указать cmake-gui или ccmake, где искать, через параметры графического интерфейса или командной строки или, возможно, в вашем CMakeLists.txt.
drescherjm 07.09.2018 15:40

@ptiza_v_nebe: Я прав, что find_package() имеет общий ничего такого с вашей проблемой, потому что вы просто не используете его? Если да, то почему вы вообще это замечаете - это сильно сбивает с толку вашу проблему.

Tsyvarev 07.09.2018 16:00

Моя проблема возникла из этого варианта использования. Мне просто было интересно, почему заголовки моей библиотеки должны быть явно связаны с target_include_directories () и почему мне не нужно этого делать, если я, например, find_package (PNG)

ptiza_v_nebe 07.09.2018 17:05
why my library headers has to be explicitly linked with target_include_directories() and why I dont need to do this If I do find_package(PNG) for example - Итак, вы удивляетесь, как find_package(PNG) плюс target_link_libraries(mytarget PNG::PNG) сообщает CMake о включить каталоги, я прав? PNG::PNG - ИМПОРТИРОВАННАЯ ЦЕЛЬ, соответствующая библиотеке PNG. У этой цели есть каталоги включения, ассоциированный с ним. Когда CMake связывает исполняемый файл с такой целью, он автоматически добавляет эти каталоги в исполняемый файл.
Tsyvarev 07.09.2018 17:21

Ok! Я думаю, это ближе к тому, что я ищу. Я имею в виду, что это похоже на то, что мне нужно. Чтобы доказать, что этот файл .cmake имеет прямое отношение к этому, я экспериментировал и просто ради удовольствия удалил все содержимое FindPNG.cmake. По какой-то причине cmake все еще находит включает :( Что-то похожее, что я пытался реализовать в mylib, также как файл FindXXX.cmake, но он просто не нашел включений.

ptiza_v_nebe 07.09.2018 17:27

Может быть, есть хороший учебник с простым объяснением, но с глубоким пониманием? Что-то, что будет касаться темы, о которой я говорю?

ptiza_v_nebe 07.09.2018 17:33
cmake все еще находит, включает Это связано с тем, что включения для PNG находятся в месте, которое ваш компилятор уже имеет в качестве папки включения.
drescherjm 07.09.2018 18:19
Что-то, что будет касаться темы, о которой я говорю? Я не знаю такого руководства. Я изучил CMake, прочитав документацию и попробовав примеры в cmake-wiki. CMake - это не то, чему можно научиться за день. При этом указанные учебные запросы не относятся к теме StackOverflow.
drescherjm 07.09.2018 18:39

Если ваши файлы заголовков находятся в / usr / local / include, компилятор должен их найти. Вы уверены, что их нет в подкаталоге в / usr / local / include? Кстати, CMake будет искать заголовки в альтернативных каталогах при использовании include_directories или target_include_directories. Может быть, вы могли бы просто установить include_directories (/ usr / local / include) на всякий случай ....

Gergely Nyiri 07.09.2018 19:03

Я тестировал связывание кода напрямую с C++, который на Mac - это просто какой-то символ для g ++. Что-то вроде C++ -lmylib main.cpp. Работает плавно. C++ находит мои библиотеки по стандартному пути, но тот же компилятор в cmake ничего не делает. Может быть, cmake использует другие переменные окружения?

ptiza_v_nebe 07.09.2018 20:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
16
148
0

Другие вопросы по теме