У меня есть небольшой проект игровой площадки, чтобы попрактиковаться в CMake, и он содержит библиотеку и образец приложения, использующего эту библиотеку. Посмотрите: Репо проекта на Github
Проблема, с которой я столкнулся сейчас, заключается в том, что пример приложения не может найти заголовки библиотеки. Это то чем я занимаюсь:
cd mymath
mkdir build && cd build
cmake ..
make
sudo make install
Это дает мне следующий результат:
[100%] Built target mymath
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libmymath.a
-- Up-to-date: /usr/local/include
-- Up-to-date: /usr/local/include/my-math
-- Up-to-date: /usr/local/include/my-math/even-odd.h
-- Up-to-date: /usr/local/include/my-math/even-odd
-- Installing: /usr/local/share/mymath/cmake/mymathConfig.cmake
-- Installing: /usr/local/share/mymath/cmake/mymathConfig-noconfig.cmake
Затем я попытаюсь создать пример приложения:
cd ../../project
mkdir build && cd build
cmake ..
make
Вызов cmake .. работает нормально, но при вызове make я получаю следующее сообщение об ошибке:
.../lib-lib/project/src/main.cpp:1:10: fatal error: mymath/even-odd.h: No such file or directory
#include <mymath/even-odd.h>
^~~~~~~~~~~~~~~~~~~
компиляция прекращена.
Что я делаю не так?
Вот файл mymathConfig.cmake, созданный CMake: mymathConfig.cmake
Решение
Я нашел виновника, его не было в моих файлах CMake, а скорее в следующем.
Вместо:
#include <mymath/even-odd>
Мне пришлось:
#include <my-math/even-odd>
Я исходил из предположения, что для этого мне нужно имя библиотеки, но что было необходимо, так это фактическая структура папок в подключаемом каталоге. Виноват.
Но разве это не должно быть готово после вызова find_package(mymath REQUIRED)? Мне кажется, что жесткое программирование пути не является хорошей практикой.
Да, жесткое кодирование не годится. Похоже, в вашем install(TARGETS) отсутствует INCLUDES DESTINATION для вашего install(EXPORT). Подробнее см. документация. Кроме того, ваш my-math.cmake экспортирует mymath_INCLUDE_DIRS?
При создании вашей библиотеки. Вы должны добавить для этой библиотеки вызов target_include_directories (my-math PUBLIC $ <BUILD_INTERFACE: $ {CMAKE_CURRENT_SOURCE_DIR} / include> $ <INSTALL_INTERFACE: include />) Таким образом, при компоновке с библиотекой с помощью target_link_libathraries (app my-mathraries) CMake получит информацию о каталогах my-math через my-math-config.cmake и сделает эти каталоги доступными для приложения. см. (cmake.org/cmake/help/v3.12/command/…)
@AmitSingh: Я смотрел mymathConfig.cmake для mymath_INCLUDE_DIRS - Или вы имели в виду другой файл с mymath.cmake? В любом случае, я добавил ссылку на mymathConfig.cmake в свой исходный пост, пожалуйста, посмотрите. @Noki: Я попробовал вызвать на target_include_directories(...), но проблема все та же.
@Noki: Я только что понял, что CMakeLists.txt уже получил этот звонок, см .: github.com/denvercoder21/lib-lib/blob/master/my-math/…
@ DenverCoder21 Используете ли вы макрос find_package и target_link_libraries при связывании с mymath?
@Noki: Да, см. github.com/denvercoder21/lib-lib/blob/master/project/src/… - Кроме того, ошибки возникают при вызове make в моем проекте, CMake работает нормально или, по крайней мере, проходит без ошибок.





Не пробовал, и у меня нет рядом, но я бы попробовал
include <even-odd.h>
причина в том, что
find_package(mymath)
вернет /usr/local/include/my-math в качестве пути поиска к включаемому файлу.
Вам необходимо использовать
target_include_directories(app PRIVATE /usr/local/include/my-math)в файле CMakeLists.txt, который создает ваше приложение. Вам нужен какой-то способ помочь CMake найти, где находятся ваши файлы заголовков.