Пытаюсь понять, как работает 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 и т. д., Чтобы автоматически находить заголовки?
Думаю, вам стоит прочитать документацию для find_package: cmake.org/cmake/help/latest/command/find_package.html
Да, библиотека создается с помощью cmake. Дело в том, что мой вопрос меньше связан с find_package. Почему cmake просто включает заголовки для известных библиотек, таких как eigen, boost и png, но не включает заголовки для моей библиотеки в компилятор? У них один путь! У меня проблемы с cmake? ^^
Это имеет прямое отношение к find_package, поскольку именно так CMake находит пакет.
Но если я закомментирую, например, find_package (PNG), он все равно найдет заголовки. Хорошо, он жалуется на отсутствующие символы, но это, конечно, потому, что find_package ничего не установил. Если я сделаю то же самое со своей библиотекой, в первой строке будет отображаться сообщение об отсутствии заголовков mylib.h
@ptiza_v_nebe: Я прав, что find_package() имеет общий ничего такого с вашей проблемой, потому что вы просто не используете его? Если да, то почему вы вообще это замечаете - это сильно сбивает с толку вашу проблему.
Моя проблема возникла из этого варианта использования. Мне просто было интересно, почему заголовки моей библиотеки должны быть явно связаны с target_include_directories () и почему мне не нужно этого делать, если я, например, find_package (PNG)
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 связывает исполняемый файл с такой целью, он автоматически добавляет эти каталоги в исполняемый файл.
Ok! Я думаю, это ближе к тому, что я ищу. Я имею в виду, что это похоже на то, что мне нужно. Чтобы доказать, что этот файл .cmake имеет прямое отношение к этому, я экспериментировал и просто ради удовольствия удалил все содержимое FindPNG.cmake. По какой-то причине cmake все еще находит включает :( Что-то похожее, что я пытался реализовать в mylib, также как файл FindXXX.cmake, но он просто не нашел включений.
Может быть, есть хороший учебник с простым объяснением, но с глубоким пониманием? Что-то, что будет касаться темы, о которой я говорю?
CMake, прочитав документацию и попробовав примеры в cmake-wiki. CMake - это не то, чему можно научиться за день. При этом указанные учебные запросы не относятся к теме StackOverflow.
Если ваши файлы заголовков находятся в / usr / local / include, компилятор должен их найти. Вы уверены, что их нет в подкаталоге в / usr / local / include? Кстати, CMake будет искать заголовки в альтернативных каталогах при использовании include_directories или target_include_directories. Может быть, вы могли бы просто установить include_directories (/ usr / local / include) на всякий случай ....
Я тестировал связывание кода напрямую с C++, который на Mac - это просто какой-то символ для g ++. Что-то вроде C++ -lmylib main.cpp. Работает плавно. C++ находит мои библиотеки по стандартному пути, но тот же компилятор в cmake ничего не делает. Может быть, cmake использует другие переменные окружения?




