@Nerd0_0
Программист Java, C#, совсем джун C++, линуксоид

Как правильно подключить библиотеку в С++?

Подключаю хедер к проекту так:
#include <iostream>
#include <mariadb/mysql.h>

int main(){
    MYSQL conn;
    if(!mysql_init(&conn)){
        std::cout<<"Error create MySQL descriptor";
    }
    if(!mysql_real_connect(&conn,"localhost","stats","q1w2e3r4","statsDB",3306,NULL,0)){
        std::cout<<"Error";
    std::cout<< "Успешно";
    return 0;
}

IDE CLion способна заходить внутрь хедера, то есть, все подключилось. Однако при попытке собрать make ругается:
CMakeFiles/ISPstats.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x1a): undefined reference to `mysql_init'
main.cpp:(.text+0x9b): undefined reference to `mysql_real_connect'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
CMakeFiles/ISPstats.dir/build.make:94: recipe for target 'bin/ISPstats' failed
make[3]: *** [bin/ISPstats] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/ISPstats.dir/all' failed
make[2]: *** [CMakeFiles/ISPstats.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/ISPstats.dir/rule' failed
make[1]: *** [CMakeFiles/ISPstats.dir/rule] Error 2
Makefile:118: recipe for target 'ISPstats' failed
make: *** [ISPstats] Error 2

Опыта с++ почти никакого, возможно, не вижу что-то для вас совсем очевидное. Такая проблема не только с этой библиотекой, а вообще очень часто у меня возникает, но как это исправить, не знаю. Может, еще статейки покидаете, что почитать по этой теме.
Нашел пример кода тут, однако 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.
  • Вопрос задан
  • 3439 просмотров
Пригласить эксперта
Ответы на вопрос 2
@res2001
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 для сборки.
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Если вы используете conan, то:
1) Прописаны ли у вас все нужные зависимости в conanfile.txt?
2) Подключили ли вы нужные репозитории к конану?
3) Выполняли ли вы conan install?

Файл-то сборки-то у вас более-менее правильный, но проверьте то, что я написал выше.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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