安装环境
- Linux—此处可以按照B站(黑马程序员)https://www.bilibili.com/video/BV1n84y1i7td/?p=1&vd_source=f6cc0ee72abb96e93dd5993dd9f718b6中进行对linux的安装
- Mysql的安装,黑马程序员视频讲解中也有。
- 安装Cmake 在终端使用
yum install cmake
语句即可。记得快照linux,免得哪一步就整坏了记得快照linux,免得哪一步就整坏了记得快照linux,免得哪一步就整坏了
Mysql中可能遇到的问题
mysql -uroot -p
- 输入密码后登录MySQL
- 首先按照项目REMARK.md的要求,先建立自己的yourdb库。
create database yourdb;
- 创建user表
USE yourdb;
CREATE TABLE user(
username char(50)NULL,
passwd char(50)NULL)ENGINE=InnoDB;
- 添加数据
INSERT INTO user(username, passwd) VALUES('name', 'passwd');
//输入自己的用户名和密码 此处本人为root用户和root用户密码。- 可以通过
show databases;
查看当前的数据库;
从GitHub中拉下项目
git clone https://github.com/qinguoyi/TinyWebServer.git
按照remark中修改main.cpp中的对应位置
//数据库登录名,密码,库名
string user ="root";//此处根据上述第三步中修改的
string passwd ="root";//改为自己的密码
string databasename ="yourdb";//上述第一步中的yourdb库
- build(通过脚本编译项目)
sh ./build.sh
此时如果报错
g++-o server main.cpp timer/lst_timer.cpp http/http_conn.cpp log/log.cpp CGImysql/sql_connection_pool.cpp webserver.cpp config.cpp -g -lpthread -lmysqlclient
/usr/bin/ld: cannot find -lmysqlclient
collect2: error: ld returned 1 exit status
不难发现是因为没有-lmysqlclient
此时根据网上所提到的安装库:
yum install -lmysqlclient;
我们会发现,linux提示没有
No package lmysqlclient available.
这时候会想是因为没有安装mysqlclient,搜寻一天,后来发现自己有mysqlclient
那么造成这个问题的是什么呢?
**是-lmysqlclient的路径不对,导致系统找不到!!!此时,我们可以通过
yum install mysql-devel
命令 **
如果linux提示我们以下语句说明我们已经安装了mysql
Package mysql-community-devel-8.0.36-1.el7.x86\_64 already installed and latest version Nothing to do.
接着,通过
mysql\_config
命令,查看-lmysqlclient的位置,
--libs [-L/usr/lib64/mysql -lmysqlclient -lpthread -ldl -lssl -lcrypto -lresolv -lm -lrt]--libs\_r [-L/usr/lib64/mysql -lmysqlclient -lpthread -ldl -lssl -lcrypto -lresolv -lm -lrt]
这时,我们知道了
-L/usr/lib64/mysql -lmysqlclient
为路径,根据报错提示,我们在makefile中找到以下语句;
g++-o server main.cpp timer/lst\_timer.cpp http/http_conn.cpp log/log.cpp CGImysql/sql\_connection_pool.cpp w-lpthread -lmysqlclient
将
<font color="blue">-lmysqlclient</font>
改为
<font color="blue">-L/usr/lib64/mysql -lmysqlclient</font>
注意,不是yum install -L/usr/lib64/mysql -lmysqlclient,不是安装包的问题,是路径的问题!!!!
接着,在执行
sh ./build.sh
发现不报错了!!!!
启动server(运行编译后的可执行文件)
./server
此时正常情况下,系统应该一直运行
此时如果程序立马退出了,说明有错误
但是,此时通过
ll
可以查看server的日志,但是会发现日志里面仅有:
2024-04-18 18:06:45.795666 [erro]: MySQL Error,
而不会有具体的原因,说明mysql叕问题了,根据博主https://blog.csdn.net/MYMarcoreus/article/details/121961504的指引,我们需要对源代码中
CGImysql\sql\_connection\_pool.cpp的void connection\_pool::init
函数进行改进,因此将源代码改进为:
void connection_pool::init(string url, string User, string PassWord, string DBName,int Port,int MaxConn,int close_log){
m_url = url;
m_Port = Port;
m_User = User;
m_PassWord = PassWord;
m_DatabaseName = DBName;
m_close_log = close_log;for(int i =0; i < MaxConn; i++){
MYSQL* con =NULL;
MYSQL* ret =NULL;
ret =mysql_init(con);if(ret ==NULL){// 如果mysql_init()返回空,那就打印该信息LOG_ERROR("MySQL Error: mysql_init() returns NULL");exit(1);}else{
con = ret;}
ret =mysql_real_connect(con, url.c_str(), User.c_str(), PassWord.c_str(), DBName.c_str(), Port,NULL,0);if(ret ==NULL){// 如果mysql_real_connect()返回空,那就使用mysql_errorh和mysql_errno打印具体的出错信息
string err_info(mysql_error(con));
err_info =(string("MySQL Error[errno=")+ std::to_string(mysql_errno(con))+string("]: ")+ err_info);LOG_ERROR( err_info.c_str());exit(1);}else{
con = ret;}
connList.push_back(con);++m_FreeConn;}
reserve =sem(m_FreeConn);
m_MaxConn = m_FreeConn;}
此时,保存后再次运行sh ./build.sh也就是 make ,就会报错:
g++-o server main.cpp timer/lst_timer.cpp http/http_conn.cpp log/log.cpp CGImysql/sql_connection_pool.cpp w-lpthread -L/usr/lib64/mysql -lmysqlclient
CGImysql/sql_connection_pool.cpp: In member function ‘void connection_pool::init(std::string, std::string, st,int,int)’:
CGImysql/sql_connection_pool.cpp:57:7: error: ‘to_string’ is not a member of ‘std’
+ std::to_string(mysql_errno(con))+string("]: ")+ err_info);^
make:***[server] Error 1
这又是为什么呢?
其实,是因为
to\_string
在c++11中支持,而项目中项目中的
makefile
中不支持,那么我们就需要修改执行条件!!!
这里网上找到两种方式https://blog.csdn.net/weixin_43343803/article/details/106709801我们采用第一种方法,在在makefile文件中的每个
g++
命令中加上
-std=c++11;
CXX = g++-std=c++11//其实只有第一句需要修改!!!
DEBUG =1ifeq($(DEBUG),1)
CXXFLAGS +=-g
else
CXXFLAGS +=-O2
endif
server: main.cpp ./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cpp webserver.cpp config.cpp
$(CXX)-o server $^ $(CXXFLAGS)-lpthread -L/usr/lib64/mysql -lmysqlclient
clean:
rm -r server
在这里,还遇到一个问题,在前两行有问号的问题,不知道是不是我自己误打上去的,删除就好了
此时,保存后再次运行
sh ./build.sh
,还是很快就退出了<可恶><可恶>,但是再次查看日志,我们发现已经有了错误内容,
Access denied for user 'myname'@'localhost' (using password: YES)
这一点是因为一开始
main.cpp
中密码没给对,再次给对就没有问题了!!!
此时,再次
sh ./build.sh
,然后
./server
发现不退出了!!!
欧耶,谢天谢地
登录server
此时,我们通过脚本启动了server,根据提示,下一步打开浏览器端(默认端⼝是 9006),输入ip:9006
我们发现没有一点点反应,又又又又怎么了呢!!!!
这时,通过查阅得知,应该从linux下的浏览器进入,下载浏览器
yum -y install firefox
然后进入浏览器
firefox
,输入
localhost:9006
,就可以了!!!!
整整两天,总算是跑通了,革命尚未成功,同志仍需努力啊!!!!
记得快照linux,免得哪一步就整坏了
版权归原作者 吃我一个平底锅 所有, 如有侵权,请联系我们删除。