я впервые пытаюсь связать MariaDB с программой C++ в CMake
Версия MySQL MySQL: 10.5.21 (какой сервер использует)
CMakeLists.txt, который у меня есть сейчас и который не работает, выглядит так:
`
cmake_minimum_required(VERSION 3.20)
project(Dance_Syllabuses_Backend VERSION 0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(MARIADB_DIR "C:/Program Files/MariaDB 10.5")
set(MARIADB_INCLUDE_DIR "${MARIADB_DIR}/include")
set(MARIADB_LIB_DIR "${MARIADB_DIR}/lib")
find_library(MARIADB_LIB NAMES mariadb PATHS ${MARIADB_LIB_DIR})
if (MARIADB_LIB)
message(STATUS "Found MariaDB: ${MARIADB_LIB}")
else()
message(FATAL_ERROR "MariaDB not found")
endif ()
set(ENABLE_NET OFF CACHE BOOL "Enable Net" FORCE)
set(ENABLE_ENCODINGS OFF CACHE BOOL "Enable Encodings" FORCE)
set(ENABLE_XML OFF CACHE BOOL "Enable XML" FORCE)
set(ENABLE_JSON OFF CACHE BOOL "Enable JSON" FORCE)
set(ENABLE_MONGODB OFF CACHE BOOL "Enable MongoDB" FORCE)
set(ENABLE_DATA_SQLITE OFF CACHE BOOL "Enable Data SQlite" FORCE)
set(ENABLE_REDIS OFF CACHE BOOL "Enable Redis" FORCE)
set(ENABLE_ZIP OFF CACHE BOOL "Enable Zip" FORCE)
set(ENABLE_PAGECOMPILER OFF CACHE BOOL "Enable PageCompiler" FORCE)
set(ENABLE_PAGECOMPILER_FILE2PAGE OFF CACHE BOOL "Enable File2Page" FORCE)
set(ENABLE_ACTIVERECORD OFF CACHE BOOL "Enable ActiveRecord" FORCE)
set(ENABLE_ACTIVERECORD_COMPILER OFF CACHE BOOL "Enable ActiveRecord Compiler" FORCE)
set(ENABLE_DATA_MYSQL ON CACHE BOOL "Enable MySQL" FORCE)
add_subdirectory(external/POCO)
add_executable(application
include/customer_dao.hpp
include/customer.hpp
include/scope_guard.hpp
src/customer_dao.cpp
src/customer.cpp
src/main.cpp)
target_include_directories(application PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(application PRIVATE Poco::Data Poco::DataMySQL)
`
Пытался собрать его и ожидал, что он найдет MariaDB и заработает, но этого не произошло.
Обновлено: Чтобы добавить больше ясности в сообщение
Получите сообщение об ошибке «MariaDB не найдено», которое мы и вывели. Предполагалось, что POCO позаботится об объявленных нами переменных, а затем узнает, как использовать MariaDB и где найти MariaDB.
MYSQL_ROOT_DIR — установить корневой путь установки, где найти путь включения и библиотеки MySQL или MariaDB.
MYSQL_ROOT_INCLUDE_DIRS — установить пути, по которым можно найти заголовки MySQL или MariaDB.
MYSQL_ROOT_LIBRARY_DIRS — установите пути к библиотекам, где можно найти библиотеки MySQL или MariaDB.
Это пути, на которые предположительно смотрит POCO. https://docs.pocoproject.org/current/00200-GettingStarted.html Если мы сможем установить их правильно, возможно, мы сможем найти MariaDB.
Здравствуйте, я получаю сообщение «MariaDB не найдена». Да, от set(MARIADB_DIR "C:/Program Files/MariaDB 10.5") до endif (), я не был на 100% уверен, что написать, чтобы включить MariaDB. Не удалось найти много документации по этому вопросу в Интернете.
Если это хоть немного полезно, папка MariaDB имеет такую структуру каталогов ссылка
Использование mariadb
в качестве имени для find_library
означает, что вы хотите найти файл с именем mariadb.lib
или libmariadb.lib
. Есть ли у вас один из этих файлов в подкаталоге lib/
? Если нет, то вам следует исправить вызов find_library
.
@Tsyvarev Да, в подкаталоге lib/ есть файл libmariadb.dll.
Отредактировал пост, чтобы внести в него немного больше ясности
Даже если вы используете общую библиотеку MariaDB (.dll
), у вас все равно должна быть .lib
. Именно .lib
файл ищется find_library
и именно .lib
следует использовать для ссылки. .dll
используется только во время выполнения.
Да, вы правы, в каталоге lib тоже есть файл libmariadb.lib, я случайно скопировал и вставил имя файла .dll в предыдущем сообщении, так как у него было то же имя (моя ошибка). Скриншот того, что я вижу ibb.co/s3kTTsT
При запуске cmake
для настройки проекта добавьте для него опцию --debug-find
. Таким образом, CMake напечатает, какие файлы и каталоги просматриваются во время команды find_library
.
Спасибо за советы, у меня должно быть время, чтобы попробовать еще раз на этой неделе и рассчитывать на больший прогресс.
Похоже, вы установили MariaDB Server без компонента разработки (который содержит заголовочные файлы и библиотеки). Файла .dll недостаточно, для связывания вам потребуются символы из файлов .lib.
Также обратите внимание, что включаемые файлы хранятся не в ${MARIADB_DIR}/include
, а в ${MARIADB_DIR}/include/mysql
.
«не сработало» — это не описание проблемы, с которой мы могли бы вам помочь. Объясните, пожалуйста, что именно не работает. Например. покажите сообщение об ошибке, которое вы получили. Кстати, вы определяете переменные
MARIADB_INCLUDE_DIR
иMARIADB_LIB
, которые описывают MariaDB, но никогда не используете эти переменные.