Подключение библиотеки в CLion [Mac]

Есть Macbook, CLion в качестве IDE и библиотека GSL. Хочется в проекте использовать библиотеку, но не получается подключить. Большинство примеров в гугле для Boost и с GSL они не прокатывают. UPD: Нашёл вариант, но чего-то не хватает: Содержимое файла Findgsl.cmake :
set(FIND_gsl_PATHS ~/usr/local/) find_path(gsl_INCLUDE_DIR gsl PATH_SUFFIXES include PATHS_ $) find_library(gsl_LIBRARY NAME libgsl PATH_SUFFIXES lib PATHS $)
UPD: Подобный вариант решил проблему, когда IDE не видела хэдеры библиотеки. Однако функции из библиотеки не распознавала.
Путём гугления clion gsl нашёл на Stack Overflow ответ и подредактировал своё:
cmake_minimum_required(VERSION 3.14) project(newnewton) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_FLAGS "$ -std=c++14 -Wall") set(SOURCE_FILES main.cpp TVector.cpp TVector.h Tools.cpp Tools.h newton.cpp newton.h gradient_descent.cpp gradient_descent.h functions.cpp functions.h) add_executable(newnewton $) set(gsl_INCLUDE_DIR /usr/local/include) find_package(gsl REQUIRED) include_directories($) target_link_libraries($ GSL::gsl GSL::gslcblas)
Настройка библиотеки MPI в CLion
Привет «параллельным программистам», мы продолжаем настраивать библиотеку MPICH везде, где это возможно и сегодня на операционном столе замечательная IDE CLion от JetBrains. До этого я уже рассказывал о том, как установить библиотеку MPI в систему Linux, и затронул тему настройки MPI в Eclipse.
Необходимо сразу подчеркнуть, что сейчас будет сказка, настройка в CLion несравнимо проще, чем в Eclipse. CLion сам по себе на голову выше многих IDE, поэтому если вы можете себе его позволить, то незамедлительно позволяйте. Сам я бедный студент ЧелГУ и пользуюсь лицензией для студентов, которая будет действовать до тех пор, пока числюсь в списках университета. Спасибо JetBrains за такую возможность!
Подключить библиотеку MPI в CLion
Проекты на C/C++ в CLion`е собираются с помощью автоматизированной кроссплатформенной системы сборки CMake. Суть в двух словах, мы пишем файл CMakeLists.txt в корне проекта, который содержит правила для сборки, на которые ориентируется Make, либо ее аналог в Windows. Более подробно о CMake на вики и статья на хабре .
Подключать библиотеку мы будем именно с помощью настроек CMake. Вот, как выглядит CMakeLists.txt вновь созданного проекта.

Нам нужно добавить библиотеку mpi.h , сделать это можно с помощью правила include_directories() . В качестве аргумента передаем полный путь до библиотеки(в Linux Ubuntu — /usr/include/mpi/ ). Не забываем нажать «Reload changes» справа в углу.

Готово, теперь CLion знает все функции MPI, но пока не умеет их собирать.
Настроить компилятор MPICC(MPIC++) в CLion
Настройка компилятора прописывается в CMakeLists.txt правилами set() . Напомню, что в Ubuntu компиляторы живут по адресу /usr/bin/mpicc для си, и /usr/bin/mpic++ для си++ соответственно. Поэтому добавляем два правила: set(CMAKE_C_COMPILER «/usr/bin/mpicc») и set(CMAKE_CXX_COMPILER «/usr/bin/mpic++») .

Важное замечание
Буквально только, после очередной переустановки системы, мной было замечено, что библиотека корректно подключилась только с настройкой
cmake_minimum_required(VERSION 3.6)
Заключение
Дело сделано, теперь можно писать программы на MPI в чудесной CLion. А вообще, CMake очень крутая функциональная штука, которую полезно знать. Возможно я посвящу ей отдельную запись со всеми подробностями. А на сегодня у меня все, спасибо за внимание!
Toliak / Guide.md
Чтобы установить значение опции, отличное от «по умолчанию», необходимо дописать -DНАЗВАНИЕ_ОПЦИИ=Значение к команде конфигурирования. Команда после этого может выглядеть, например, так:
cmake -H. -B.build -DBUILD_DEMO=On
Чтобы сделать такое действие в CLion, необходимо перейти в: Settings -> CMake -> CMake options.
Если используется Hunter (пакетный менеджер), то прописываются его настройки
include("tools/gate/cmake/HunterGate.cmake") # Подключение CMake скрипта с дополнительными функциями HunterGate( URL "https://github.com/ruslo/hunter/archive/v0.23.214.tar.gz" # URL к ядру Hunter SHA1 "e14bc153a7f16d6a5eeec845fb0283c8fad8c358" # SHA1 хэш )
На этапе конфигурирования, CMake ожидает файл tools/gate/cmake/HunterGate.cmake .
Если этот файл не существует, возможны 2 варианта:
- Необходимо добавить гит подмодуль:
git submodule add https://github.com/hunter-packages/gate.git tools/gate
- Либо (если используется шаблонный репозиторий) необходимо обновить подмодули:
git submodule update —init —recursive
URL и SHA1 ядра Hunter можно получить в релизах: https://github.com/hunter-packages/gate.git
project(MyAwesomeProject)
Дополнительные опции для компилятора (могут отсутствовать)
string(APPEND CMAKE_CXX_FLAGS " -Wall -Werror") # Флаги для включения всех предупреждений и дропа компиляции при их наличии
Подключение зависимых библиотек
Затем осуществляется подключение библиотек, в которых нуждается проект (Boost, GTest, Threads и т.д.)
Указания для Hunter о необходимо коллекционирования указанных пакетов
hunter_add_package(GTest) # Указание Hunter о добавлении пакета GTest hunter_add_package(Boost COMPONENTS filesystem regex) # Указание Hunter о добавлении пакета Boost с указанными компонентами
Указания о том, какие пакеты будут использованы (ожидается их наличие)
find_package(GTest CONFIG REQUIRED) find_package(Boost CONFIG REQUIRED filesystem regex) find_package(Threads REQUIRED)
CONFIG — ключевое слово, показывающее маску названий конфигурационных файлов.
REQUIRED — обязательность подключения пакета (иначе — ошибка).
Добавление целей сборки
После настройки окружающией среды пишется информация о том, что ожидается получить в результате сборки
add_executable( my_very_interesting_target # Название цели $ /path_to_cpp_file $ /path_to_another_cpp_file )
add_library( my_very_interesting_target_library # Название цели STATIC # Тип библиотеки (SHARED или STATIC) $ /path_to_cpp_file $ /path_to_another_cpp_file )
Указание директорий с заголовочными файлами
target_include_directories( target_name # Цель, при сборке которой учитываются указанные пути к заголовочным файлам PUBLIC # область видимости (PRIVATE, INTERFACE или PUBLIC) $ /include )
Указание библиотек для линковки
target_link_libraries( target_name # Цель, к которой просходит линковка library_name # Библиотеки, которые линкуются к цели )
Названия библиотек из Hunter, как правило, имеют вид LibraryName::ComponentName .
Данные о библиотеках из пакета, добавленного через find_package хранятся в переменных. Например, для Threads: $
Для сборки тестирования необходимо наличие:
- Добавления пакета googletest (GTest в Hunter)
- Цели для сборки исполняемого файла
- Линковки gtest_main и gtest (GTest::main и GTest::gtest в Hunter) к цели
- Включенного тестирования в конфигурационном файле
enable_testing() # Включение тестирования add_test(NAME unit_tests COMMAND tests) # При тестировании выполнится исполняемый файл tests
Можно добавлять несколько тестовых целей под разными названиями. И даже с использованием разных фреймворков.
Для сборки и выполнения тестирования необходимо выполнить следующую команду (ожидается предварительное конфигурирование):
cmake --build .build --target test
Пример тела конфигурационного файла с тестированием:
# 1 hunter_add_package(GTest) find_package(GTest CONFIG REQUIRED) find_package(Threads) # 2 add_executable( tests $ /tests/test.cpp ) # 3 target_link_libraries( tests $ GTest::gtest GTest::main ) # 4 enable_testing() add_test(NAME unit_tests COMMAND tests)
Для удобства в CLion необходимо добавить конфигурацию сборки google test.
Начало конфигурации. Как правило, его трогать не надо.
if (BUILD_COVERAGE) # Если активна опция сборки с покрытием set(ENABLE_COVERAGE ON CACHE BOOL "Enable coverage build." FORCE) # Установка значения переменной ENABLE_COVERAGE list(APPEND CMAKE_MODULE_PATH "$ /cmake") # Дополнение возможных местоположений конфигурационных cmake файлов find_package(codecov) # Нахождение пакета (ожидается существование файла cmake/FindCodecov.cmake)
Далее прописываются цели, которые будут проанализированы на процент покрытия.
add_coverage(my_awesome_and_very_interesting_target) add_coverage(tests)
Конец конфигурации. Как правило, не надо трогать.
list(APPEND LCOV_REMOVE_PATTERNS "'$ /tests/*'") # Удаление файлов с тестами из анализа coverage_evaluate() # Вызов анализатора endif ()
Для начала необходимо настроить окружение. Как правило, это не надо трогать
os: linux # ОС sudo: required # Необходимость прав sudo language: "minimal" # Языковой шаблон services: - docker # Необходимые сервисы env: # Based on Ubuntu 18.04 # GCC 7.3 # clang 7 # CMake 3.10 # gcovr # jscpd # cpplint - DOCKER_IMAGE="rusdevops/bootstrap:cpp" # Используется по умолчанию # Based on Alpine 3.10 # GCC 8.3 # CMake 3.14 # gcovr # jscpd # valgrind # Hunter GTest v1.8.0 (cached) # Hunter Boost cached components: exception # filesystem # log # regex # system # - DOCKER_IMAGE="toliak/bootstrap-cpp" # Для использования снять комментарий before_script: - docker pull $DOCKER_IMAGE # Предварительное скачивание образа
Далее необходимо указать jobs’ы, которые будет выполнять Travis. Jobs содержит название и команды.
jobs: include: - name: "tests" # Название script: # Команды для исполнения - docker run -t -v $(pwd):/var/builder/ -w /var/builder --entrypoint ./scripts/tests.sh $DOCKER_IMAGE - name: "quality" script: - docker run -t -v $(pwd):/var/builder/ -w /var/builder --entrypoint ./scripts/duplication.sh $DOCKER_IMAGE # И так далее
К таким относятся, например, правила для веток и для уведомлений. Например:
notifications: email: false
Как правильно подключить библиотеку в С++?
Опыта с++ почти никакого, возможно, не вижу что-то для вас совсем очевидное. Такая проблема не только с этой библиотекой, а вообще очень часто у меня возникает, но как это исправить, не знаю. Может, еще статейки покидаете, что почитать по этой теме.
Нашел пример кода тут, однако Cmake ругается так:
CMake Error at CMakeLists.txt:17 (find_package): By not providing "FindMariaDBClient.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "MariaDBClient", but CMake did not find one. Could not find a package configuration file provided by "MariaDBClient" with any of the following names: MariaDBClientConfig.cmake mariadbclient-config.cmake Add the installation prefix of "MariaDBClient" to CMAKE_PREFIX_PATH or set "MariaDBClient_DIR" to a directory containing one of the above files. If "MariaDBClient" provides a separate development package or SDK, be sure it has been installed.
- Вопрос задан более трёх лет назад
- 2976 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 2
Developer, ex-admin
1.Библиотека должна быть установлена в систему, что бы cmake смог ее найти. Лучше всего использовать штатный менеджер пакетов ОС. Кроме библиотеки нужно еще ставить и dev пакеты для нее (это заголовки). dev пакеты нужны как раз для возможности собрать свой (или не свой) код, использующий библиотеку. В некоторых дистрибутивах линукс может и не быть dev пакетов. В винде их нет то же, для MSVS есть свой менеджер пакетов — vcpkg.
2.Вы должны заставить cmake найти библиотеку, это делается командами find_package или find_library.
find_package — более расширенная версия, но для нее нужен модуль поиска. Для многих популярных библиотек cmake содержит уже готовые модули. Искать их можете тут по Find. Для MySQL клиента готового модуля нет. Можно загуглить, я думаю, будет не трудно найти готовый модуль и использовать его в своем проекте.
find_library — просто ищет библиотеку по стандартным путям. Но для сборки обычно этого мало, т.к. нужны еще заголовочные файлы и если пакетный менеджер ставит их в специфические пути, то они будут не доступны. Поэтому лучше использовать find_package — он ищет все.
3.Добавить путь к заголовочным файлам библиотеки к проекту с помощью команды: target_include_directories
Переменная, содержащая путь должна быть определена в п.2 (либо вы задаете путь вручную)
4.Добавить библиотеку в список линковки с помощью команды: target_link_libraries
Аналогично нужно использовать переменные, которые будут определены в п.2.
В этом процессе есть разные нюансы, которые могут влиять на используемые средства, например что делать если библиотеки нет в репозитории ОС или она распространяется только в виде исходников.
В итоге все манипуляции приводят к тому, что компилятору задаются опции -I (для включения каталога с заголовочными файлами библиотеки), -l и возможно -L — для включения библиотеки в список линковки.
Все это можно сделать и руками задав для компилятора нужные опции с помощью add_compile_options и add_link_options — но это приведет к тому, что скорее всего на другом компьютере или в другой ОС вам придется править cmakelist.txt для сборки.