C++图书管理系统(二)环境配置

news/2025/3/19 14:05:55/文章来源:https://www.cnblogs.com/PHarr/p/18780904

动态链接库 Connector/C++

本地环境:Win10 + Clion + MSVC + mysql + connector/c++

首先配置Clion的camke设置,我们要在cmake设置中选择 MSVC 和 release 其他的默认就好了。

然后我们的CMakeLists.txt如下

cmake_minimum_required(VERSION 3.30)
project(BooksManagementSystem)# 设置 Connector C++ 目录
set(MYSQL_CONNECTOR_DIR "C:/Program Files/MySQL/mysql-connector-c++-9.2.0-winx64")
# 引入文件目录
include_directories(${MYSQL_CONNECTOR_DIR}/include/jdbc)
# 引入链接库目录
link_directories(${MYSQL_CONNECTOR_DIR}/lib64/vs14)add_executable(BooksManagementSystem main.cpp)target_link_libraries(BooksManagementSystemmysqlcppconnmysqlcppconnx
)

我这里使用的版本是connector c++ 9.2.0,使用的接口还是jdbc风格的。

然后我把lib64目录下所有的.dll文件放到可执行程序的目录下,我这里是四个.dll程序,放在cmake-build-release-visual-studio目录下。

然后main.cpp内容如下

#include <iostream>
// MySQL Connector/C++ 核心头文件
#include <mysql_driver.h>    // MySQL驱动接口
#include <mysql_connection.h> // 数据库连接类
#include <cppconn/statement.h> // SQL语句执行接口
#include <cppconn/resultset.h> // 结果集处理类
#include <cppconn/exception.h> // SQL异常类int main() {try {// 数据库驱动和连接对象声明sql::mysql::MySQL_Driver *driver;  // MySQL驱动实例sql::Connection *con;              // 数据库连接对象sql::Statement *stmt;              // SQL语句执行对象sql::ResultSet *res;               // 查询结果集对象// 获取MySQL驱动实例(单例模式)driver = sql::mysql::get_mysql_driver_instance();// 建立数据库连接(格式:协议://主机:端口)con = driver->connect("127.0.0.1:3306", "root", "123456");// 选择操作的数据库(相当于USE testdb)con->setSchema("testdb");// 创建Statement对象(用于执行静态SQL语句)stmt = con->createStatement();// 执行查询语句并获取结果集res = stmt->executeQuery("SELECT * FROM books");// 遍历结果集(每次next()移动游标到下一行)while (res->next()) {std::cout << "book_id: " << res->getInt("book_id") << std::endl;std::cout << "title: " << res->getString("title") << std::endl;std::cout << "author: " << res->getString("author") << std::endl;std::cout << "published_date: " << res->getString("published_date") << std::endl;std::cout << "-----------------------------------------------\n";}// 释放资源delete res;delete stmt;delete con;} catch (sql::SQLException &e) {std::cerr << "MySQL Error: " << e.what() << std::endl;std::cerr << "Error code: " << e.getErrorCode() << std::endl;std::cerr << "SQL State: " << e.getSQLState() << std::endl;}return 0;
}

如果无法编译,并看到了如下的报错

 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

说明是文件编码的问题,我们只需要在clion右下角编码的位置选择UTF-8并且添加BOM即可。

然后我们正常运行,可以看到如下内容

book_id: 1
title: The Catcher in the Rye
author: J.D. Salinger
published_date: 1951-07-16
-----------------------------------------------
book_id: 2
title: Harry Potter
author: J.K. Rowing
published_date: 1997-06-26
-----------------------------------------------
book_id: 1234
title: The Hobbit
author: J.R.R Tolkien
published_date: 1937-09-21
-----------------------------------------------
book_id: 1235
title: 1984
author: Orwell
published_date: 1949-06-08
-----------------------------------------------进程已结束,退出代码为 0

当然了,具体的内容要取决于你的数据库。


分隔线下为旧版内容,我原本的编译器是用Cygwing构建的,但出现了神秘且无法解决的undefined reference错误,我认为可能是Cygwin没有兼容Connector/C++,因此我重新安装了MVSC编译器,不过以下内容和Cygwin无关的部分还是可以参考,所以予以保留


我本地是环境是 Win10 CLion2024.3 Cygwin mysql8.0.40

链接链接库

首先我如果要调用 MySQL 的官方API,首先要用到MySQL Connector/C这个库。

首先我们要去MySQL\MySQL Server 8.0目录下找到以下两个目录

  • include,存放头文件
  • lib,存放链接库

因此我们修改CMakeLists.txt如下即可。

cmake_minimum_required(VERSION 3.30)
project(BooksManagementSystem)include_directories("C:/Program Files/MySQL/MySQL Server 8.0/include")
link_directories("C:/Program Files/MySQL/MySQL Server 8.0/lib")set(CMAKE_CXX_STANDARD 20)add_executable(BooksManagementSystem main.cpp)target_link_libraries(BooksManagementSystem libmysql)

如果你的编译器是MinGW应该是没有问题的。但是我的编译器是Cygwin。

但是要注意

  • Cygwin 模拟 Unix 环境,路径风格为 /cygdrive/c/...,易与 Windows 原生路径冲突。
  • MinGW 是纯 Windows 原生编译工具,推荐优先使用。

因此,我们应该将这样写CMakeLists.txt

cmake_minimum_required(VERSION 3.30)
project(BooksManagementSystem)# 将 Windows 路径转换为 Cygwin 的 /cygdrive/c/... 格式
set(MYSQL_INCLUDE_DIR "/cygdrive/c/Program Files/MySQL/MySQL Server 8.0/include")
set(MYSQL_LIB_DIR "/cygdrive/c/Program Files/MySQL/MySQL Server 8.0/lib")include_directories(${MYSQL_INCLUDE_DIR})
link_directories(${MYSQL_LIB_DIR})set(CMAKE_CXX_STANDARD 20)add_executable(BooksManagementSystem main.cpp)target_link_libraries(BooksManagementSystem libmysql)

修改完之后,我们修改main.cpp,引入头文件mysql.h

#include <iostream>
#include <mysql.h>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

然后应该可以正常编译的。

消除 clangd 错误报错

当按照上述的方法修改后,我们的编译应该是可以正常编译的。但是的我们的CLion应该会报一个错mysql.h' file not found。这是i因为clion的代码检查是依托clangd,但是我们的编译是使用的cmake,我们修改了cmake,使得代码可以正常的编译,但是clangd 并没有找到这个链接库。

解决方法一

在项目的根目录下创建.clangd文件,内容如下

CompileFlags:Add:- "-IC:/Program Files/MySQL/MySQL Server 8.0/include"- "-IC:/Program Files/MySQL/MySQL Server 8.0/include/mysql"Remove: []

额外给clangd 指定链接库的地址。

解决方法二

打卡cmake的设置,在 CMake options中加入

-DCMAKE_EXPORT_COMPILE_COMMANDS=ON

这样在编译时,就会在cmake-build-debug目录下生成一个文件compile_commands.json,我这里的内容如下

[
{"directory": "/cygdrive/c/Users/PHarr/BooksManagementSystem/cmake-build-debug","command": "/usr/bin/c++.exe -I\"/cygdrive/c/Program Files/MySQL/MySQL Server 8.0/include\" -g -std=gnu++20 -fdiagnostics-color=always -o CMakeFiles/BooksManagementSystem.dir/main.cpp.o -c /cygdrive/c/Users/PHarr/BooksManagementSystem/main.cpp","file": "/cygdrive/c/Users/PHarr/BooksManagementSystem/main.cpp","output": "CMakeFiles/BooksManagementSystem.dir/main.cpp.o"
}
]

可以看倒的时,在commond中就会有我添加的includelib两个目录,这样clangd就会读取compile_commands.json,并且获取到我添加链接库的地址。

在CLion中链接MySQL

虽然我们可以直接用C++操作数据库,也可以在终端中操作数据库。但是我们也可以在CLion链接数据库,这样可以使用到CLion 提供的一些辅助工具。具体实现可以可以直接在最右侧点击数据库,然后添加就好了。

使用 Connector/C++ 链接数据库

刚才我们已经可以链接数据库。mysql.h这个库虽然是下载MySQL就会自带的一个库,但实际上它是C语言的API。这里再来设置一下C++的API。

首先进入MySQL官网https://dev.mysql.com/downloads/,找到Connector/C++。选择这个版本下载Windows (x86, 64-bit), ZIP Archive

一种方法是我们把这个文件放到项目的cmake-build-debug中,当然更通用的方法是放在MySQL的根目录下。

根据不同的版本,文件路径可能略有不同,我这里的Connector/C++ 版本是9.2.0。

然后在根目录下有

  • include存放头文件
  • lib64存放链接库

在新版版本的Connector提供了多种的API,这里我们还是采用JDBC风格的。因此头文件的目录是include/jdbc

我当前版本的链接库,需要要用的都在lib64/vs14目录下,我们看到这里出现了多个lib,这里考虑到我们并会对库文件修改,我们选择使用静态链接库mysqlcppconn-static.lib

因此我的CMakeLists.txt如下

cmake_minimum_required(VERSION 3.30)
project(BooksManagementSystem)# 设置 Connector C++ 目录
set(MYSQL_CONNECTOR_DIR "/cygdrive/c/Program Files/MySQL/mysql-connector-c++-9.2.0-winx64")
# 引入文件目录
include_directories(${MYSQL_CONNECTOR_DIR}/include/jdbc)
# 引入链接库目录
link_directories(${MYSQL_CONNECTOR_DIR}/lib64/vs14)set(CMAKE_CXX_STANDARD 20)add_executable(BooksManagementSystem main.cpp)target_link_libraries(BooksManagementSystem mysqlcppconn-static)

这里简单介绍一下camke的三种命令之间的区别

  • include_directories(),用于添加头文件(.h)的搜索路径,

  • link_directories(),用于添加库文件(.so.a 等)的搜索路径

  • link_libraries(),直接指定需要链接的库名称或路径,已逐渐被废弃,推荐使用 target_link_libraries()

然后我们的main.cpp如下

#include <iostream>
#include <mysql_driver.h>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

到这里应该可以正常编译的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901508.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go-gRPC微服务调用

协议介绍 RPC协议RPC(远程过程调用协议),通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC假定某些协议的存在,例如TCP/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发包括网络分布式多程序在内的应用…

突破性技术:制药冻干机实现EtherCAT与Profinet网关模块无缝监控集成

案例分享:冻干机 EtherCAT 转 Profinet 实现温湿度监控 在现代医药生产过程中,冻干机作为关键设备,对温湿度的控制与监测尤为重要。某医药企业在其冻干机系统升级中,面临一个典型的通讯挑战:主控制系统采用 EtherCAT 协议,而现场的温湿度监控系统及其他过程控制设备则基于…

java-JNDI(二)-高版本绕过

JNDI 高版本的绕过 为了防止 JNDI 攻击,Oracle 对 JNDI 的远程类加载漏洞(如 LDAP 或 RMI 协议的远程代码执行(RCE))进行了限制 com.sun.jndi.rmi.object.trustURLCodebase=false com.sun.jndi.cosnaming.object.trustURLCodebase=false com.sun.jndi.ldap.object.trustUR…

tile

dsfTechnorati Tags: gjhgsdhttp://dfdfdfddfdfdfdsfdfdf

电视机顶盒刷机,更改固件包教程

这几天捣鼓了很久的刷机包,终于学会了怎么把已经弄好的刷机包,更改成自己想要的桌面。下面是我整理好的详细教程,本教程所需工具:刷机包大全、MLK软件、mumu模拟器 刷机包大全: 链接: https://pan.baidu.com/s/1G0on4sV9QmpxPXLUSN5ttQ?pwd=5279 提取码: 5279 一.确定机顶…

Java技术栈面试八股文:掌握这九大关键领域

Java基础:这是Java开发的基石,包括Java语言的基本语法、数据类型、控制结构、面向对象编程(OOP)概念(如类、对象、继承、封装、多态)、异常处理、集合框架等。掌握这些基础知识对于理解更高级的Java特性至关重要。Java Web基础:涉及Java在Web开发中的应用,包括Servlet、…

Unity —— SpriteAtlas + Include in Build

前言在使用atlas Sprite的过程中,会忍不住产生一个疑问,atlas是做什么用的,这个include in Build的含义是什么呢,以及它是否应该被勾选。网上查阅到了很多资源,有的说这个选项大胆勾选,有的说这个选项勾选完后图集打包后的纹理在游戏启动后,会一直常驻内存,需要自己做好…

2025预测:PLM系统集成AI的7种智能决策应用场景

随着科技的飞速发展,产品生命周期管理(PLM)系统与人工智能(AI)的集成正逐渐成为企业提升竞争力的关键因素。这种集成不仅能够优化产品开发流程,还能在多个环节实现智能决策,为企业带来前所未有的价值。在2025 年,我们有望看到 PLM 系统集成 AI 后在众多领域展现出强大的…

PLM项目管理软件在汽车行业的应用案例

PLM项目管理软件在汽车行业的应用案例 汽车行业作为制造业的重要组成部分,面临着日益复杂的产品研发、生产管理等挑战。在这样的背景下,PLM(产品生命周期管理)项目管理软件应运而生,为汽车企业提升竞争力提供了有力支持。PLM项目管理软件涵盖了从产品概念设计到产品退役的…

java自学学习路线笔记+实践项目+面试八股文

基础知识巩固Java基础:掌握基本语法、数据类型、控制结构、面向对象等核心概念。推荐学习资源:韩顺平老师的B站课程。 Java进阶:深入学习集合框架、IO流、反射、注解等高级特性。 Java并发:理解线程、锁、并发工具类等,为高并发项目开发打基础。数据库技术MySQL:掌握SQL语…

awdp pwn

ciscn&ccb半决第十八届CISCN&CCB半决赛 awdp pwn typo snprintf() 是一个 C 语言标准库函数,用于格式化输出字符串,并将结果写入到指定的缓冲区,与 sprintf() 不同的是,snprintf() 会限制输出的字符数,避免缓冲区溢出。 C 库函数 int snprintf(char str, size_t …