0


初次运行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 =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,免得哪一步就整坏了

标签: 服务器 c++ linux

本文转载自: https://blog.csdn.net/m0_73537205/article/details/138239030
版权归原作者 吃我一个平底锅 所有, 如有侵权,请联系我们删除。

“初次运行TinyWebServer遇到的问题”的评论:

还没有评论