初次运行TinyWebServer遇到的问题

安装环境

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 = 1
ifeq ($(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,免得哪一步就整坏了

  • 41
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值