最新回复 发布由 墨香年少
-
-
/server/cgi/include目录下为boost和fastcgi++的include目录
/server/cgi/lib为boost和fastcgi的lib文件
-
1.安装spawn-fcgi-1.6.5
wget https://download.lighttpd.net/spawn-fcgi/releases-1.6.x/spawn-fcgi-1.6.5.tar.xz tar -xf spawn-fcgi-1.6.5.tar.xz cd spawn-fcgi-1.6.5 ./configure make make install
2.安装fastcgi++-2.1
wget http://download.savannah.nongnu.org/releases/fastcgipp/fastcgi++-2.1.tar.bz2 tar -xf fastcgi++-2.1.tar.bz2 cd fastcgi++-2.1 ./configure --disable-shared --enable-static make && make install
3.安装boost_1_64_0
wget https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.gz tar -zxvf boost_1_64_0.tar.gz cd boost_1_64_0 ./bootstrap.sh ./b2 install
编写一个程序测试boost
#include <string> #include <iostream> #include <boost/version.hpp> #include <boost/config.hpp> using namespace std; int main() { cout << BOOST_VERSION << endl; //Boost版本号 cout << BOOST_LIB_VERSION << endl; //Boost版本号 cout << BOOST_PLATFORM << endl; //操作系统 cout << BOOST_COMPILER << endl; //编译器 cout << BOOST_STDLIB << endl; //标准库 }
编译
g++ test_boost.cpp -o test_boost
成功会出现如下界面
接下来,写一个cgi文件来测试cgi环境是不是生效
文件名称为main.cpp,代码如下:
#include <boost/date_time/posix_time/posix_time.hpp> #include <fstream> #include <fastcgi++/request.hpp> #include <fastcgi++/manager.hpp> void error_log(const char* msg) { using namespace std; using namespace boost; static ofstream error; if(!error.is_open()) { error.open("/tmp/errlog", ios_base::out | ios_base::app); error.imbue(locale(error.getloc(), new posix_time::time_facet())); } error << '[' << posix_time::second_clock::local_time() << "] " << msg << endl; } class HelloWorld: public Fastcgipp::Request<wchar_t> { bool response() { out << "Content-Type: text/html; charset=utf-8\r\n\r\n"; out << "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"; out << "<title>fastcgi++: Hello World in UTF-8</title></head><body>"; out << "<h2>this is a test fastcgi demo</h2>"; out << "</body></html>"; err << "Hello apache error log"; return true; } }; int main() { try { Fastcgipp::Manager<HelloWorld> fcgi; fcgi.handler(); } catch(std::exception& e) { error_log(e.what()); } }
使用如下命令:
g++ main.cpp -o main -I/server/cgi/include -L/server/cgi/lib -lfastcgipp -lboost_system -lboost_thread -lpthread
生成了main文件后,配置nginx
使用浏览器查看cgi
-
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <limits.h> #include <sys/types.h> #include <sys/wait.h> #define BUFSZ 150 void err_quit(char *msg); int main(int argc, char *argv[]) { FILE* fp; int count; char buf[BUFSZ]; char command[150]; sprintf(command, "ps -ef | grep MainServer | grep -v grep | wc -l" ); while(1) { if((fp = popen(command,"r")) == NULL) { err_quit("popen"); } if( (fgets(buf,BUFSZ,fp))!= NULL ) { count = atoi(buf); if(count == 0) { //进程不存在,需要启动 system("/server/mainserver/MainServer &"); printf("已经重新拉起!\n"); } else { //进程存在 printf("进程存在\n"); } } usleep(1000000); //1秒 } pclose(fp); return EXIT_SUCCESS; } void err_quit(char *msg) { perror(msg); exit(EXIT_FAILURE); }
附上守护进程代码:
void set_daemon(){ int ret_code = fork(); if (ret_code < 0){ exit(1); }else if (ret_code>0){ exit(0); } setsid(); ret_code = fork(); if (ret_code < 0){ exit(1); }else if (ret_code>0){ exit(0); } chdir("."); umask(0); for(int fd = 0;fd< getdtablesize();fd++){ close(fd); } } int main(int argc, char *argv[]) { set_daemon(); return 0; }
-
-
清除缓存:
hash -r
-
std::string UrlEncode(const std::string& szToEncode) { std::string src = szToEncode; char hex[] = "0123456789ABCDEF"; string dst; for (size_t i = 0; i < src.size(); ++i) { unsigned char cc = src[i]; if ( cc >= 'A' && cc <= 'Z' || cc >='a' && cc <= 'z' || cc >='0' && cc <= '9' || cc == '.' || cc == '_' || cc == '-' || cc == '*') { if (cc == ' ') { dst += "+"; } else dst += cc; } else { unsigned char c = static_cast<unsigned char>(src[i]); dst += '%'; dst += hex[c / 16]; dst += hex[c % 16]; } } return dst; }
std::string UrlDecode(const std::string& szToDecode) { std::string result; int hex = 0; for (size_t i = 0; i < szToDecode.length(); ++i) { switch (szToDecode[i]) { case '+': result += ' '; break; case '%': if (isxdigit(szToDecode[i + 1]) && isxdigit(szToDecode[i + 2])) { std::string hexStr = szToDecode.substr(i + 1, 2); hex = strtol(hexStr.c_str(), 0, 16); //字母和数字[0-9a-zA-Z]、一些特殊符号[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@] //可以不经过编码直接用于URL if (!((hex >= 48 && hex <= 57) || //0-9 (hex >=97 && hex <= 122) || //a-z (hex >=65 && hex <= 90) || //A-Z //一些特殊符号及保留字[$-_.+!*'(),] [$&+,/:;=?@] hex == 0x21 || hex == 0x24 || hex == 0x26 || hex == 0x27 || hex == 0x28 || hex == 0x29 || hex == 0x2a || hex == 0x2b|| hex == 0x2c || hex == 0x2d || hex == 0x2e || hex == 0x2f || hex == 0x3A || hex == 0x3B|| hex == 0x3D || hex == 0x3f || hex == 0x40 || hex == 0x5f )) { result += char(hex); i += 2; } else result += '%'; }else { result += '%'; } break; default: result += szToDecode[i]; break; } } return result; }
-
//自行包含相关代码 void set_daemon(){ int ret_code = fork(); if (ret_code < 0){ exit(1); }else if (ret_code>0){ exit(0); } setsid(); ret_code = fork(); if (ret_code < 0){ exit(1); }else if (ret_code>0){ exit(0); } chdir("."); //一定要切换到当前目录 umask(0); for(int fd = 0;fd< getdtablesize();fd++){ close(fd); } } int main(int argc, char *argv[]) { set_daemon(); /* 自己的业务代码 */ return 0; }
-
使用Ant Design的上传组件提示strict-origin-when-cross-origin跨域的解决方案
一句话:设置headers={{"X-Requested-With":null}}
<Upload headers={{"X-Requested-With":null}} action={file_api} listType="picture-card" fileList={this.state.thumbs} onPreview={this.handlePreview} onChange={this.handleChange} > <div><PlusOutlined /><div style={{marginTop: 8,}}>选择文件</div></div> </Upload>
-
在《家有儿女》中,夏东海收到了一笔稿费 10000 元,让 3 个儿女提要求:小雪要租服务器,一年 10000;刘星要笔记本电脑,8000;小雨要带滑梯的床,6000。
看到这里,我真的很想问:
什么样的家庭,会在 2004 年的时候,收到一笔 10000 的稿费,当下就决定全部花掉?
什么样的家庭,会在 2004 年的时候,让几岁和十几岁的孩子,可以放心提出买一个成千上万块的物品的要求?
至少一定是家里都置办全了,且经济上无借债,生活水平相对富裕,且收入可观或稳定的家庭。
重看《家有儿女》,发现了好多细节,都印证了我的想法。
刘梅梳妆台上的化妆品,是资生堂、纪梵希、雅诗兰黛,这些牌子,就是搁现在,也不便宜啊。
刘星买运动鞋,动不动就是耐克或者阿迪,好几次都提到鞋子要 800 甚至 1000 多一双。当时的我连美特斯邦威都买不起。
要知道,这家里可有是 3 个孩子啊,一个孩子的话费都得乘以 3 才行。
家里冰箱常备各种饮料和冰淇淋:芬达、健力宝、高乐高、哈根达斯,就跟超市似的,随开随有。
夏东海的衣服也从来不重样,有次还穿了件 tommy hilfiger,3000 元一件。
刘梅和小雪喜欢吃榴莲,还说要每周都吃。说实在的,2004 年的时候,很多人都不知道榴莲长啥样吧。
一家人吃饭,顿顿四五个菜,多的时候八九个菜,还都是油焖大虾、红烧排骨、香辣蟹之类的,反正什么贵就吃什么,没错的。
人家每次吃水果,每块水果上都插了一根牙签。而我家吃水果,两根牙签吃一盘子水果,我再多拿一根,我妈都打我。
三个小孩每次出去吃饭都要求吃烤鸭,因为 kfc 之类的快餐早就吃腻了。
刘梅有次出国一周,给了夏东海 2000 块钱生活费让他负责全家一周开销。
2000 块一周,我都觉得太高了这标准,没想到人家夏东海 4 天就吃完了。
夏东海日常使用的剃须刀是进口的,刘梅的天天喷的香水是进口的,关键是刘梅还老去国外出差,有一次是去的还是希腊。
刘梅一家不仅物质生活丰裕,精神享受也不能少,他们经常去看个电影,看个魔术现场表演,听个音乐会。业余生活非常丰富。
2004 年看《家有儿女》的时候,就相当羡慕刘星一家,觉得他家真有钱啊。
现在再看的时候,依旧是个羡慕,他家真有钱啊。
-
下面的代码是我用Qt加载JsPrinterDll.dll的代码
.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QLibrary> #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE //出票机dll方法 typedef int (_stdcall *puniOpenUsb)(); class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); //初始化出票机 void init_printer(); private: Ui::MainWindow *ui; //出票机相关方法 bool PrintDllLoad = false; //加载状态 int printConnect = 0; //连接状态 puniOpenUsb uniOpenUsb = NULL; }; #endif // MAINWINDOW_H
.cpp
#pragma execution_character_set("utf-8") #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> #include <QDebug> #include "Windows.h" MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); this->setStyleSheet("font-family: \"Microsoft Yahei\";"); //初始化出票机 this->init_printer(); } //初始化出票机 void MainWindow::init_printer() { HINSTANCE JsPrinterDll = LoadLibraryA("JsPrinterDll"); if(JsPrinterDll) { qDebug() << "出票机dll加载......OK"; PrintDllLoad = true; uniOpenUsb = (puniOpenUsb)GetProcAddress(JsPrinterDll, "uniOpenUsb"); printConnect = uniOpenUsb(); if(printConnect >= 1) { qDebug() << "出票机连接......OK"; } else { qDebug() << "出票机连接失败!状态码:" << printConnect; } } else { PrintDllLoad = false; uniOpenUsb = NULL; printConnect = 0; } } MainWindow::~MainWindow() { delete ui; }
输出:
出票机dll加载......OK 出票机连接......OK
-
新建一个cmd的快捷方式
C:\Windows\System32\cmd.exe /A /Q /K D:\QT5\5.15.2\msvc2019\bin\qtenv2.bat
因为我的是32位的,所以直接链接的32位的bat
打开这个cmd,输入命令:
D:\QT5\5.15.2\msvc2019\bin\windeployqt.exe D:\DISK\build-DiskClient-Desktop_Qt_5_15_2_MSVC2019_32bit-Release\release\DiskClient.exe
适当调整你的位置,确保exe都是存在的。这样命令后,exe可以直接打开。
如果你有第三方的库,自行把第三方的dll拷贝过去
-
// index.js // 获取应用实例 const app = getApp() Page({ data: { tip:"", wifissid:"", wifibssid:"", }, onLoad() { this.checkWiFi() }, //检测当前wifi checkWiFi() { let that = this wx.getConnectedWifi({ success: function (e) { that.setData({ wifissid: e.wifi.SSID, wifibssid:e.wifi.BSSID, }) }, fail: function (e) { that.setData({ tip: "wifi获取失败" }) } }) } })
-
代码如下:
QFontDatabase fontDataBase; QWebEngineSettings *defaultSettings = QWebEngineSettings::globalSettings(); QFont standardFont=fontDataBase.font("Microsoft Yahei","",12); defaultSettings->setFontFamily(QWebEngineSettings::StandardFont, standardFont.family());
-
1、QJsonObject转QString
QString str = QString(QJsonDocument doc(jsonObject).toJson(QJsonDocument::Indented));
2、QString转QJsonObject
QString str = "..."; QJsonObject obj = QJsonDocument::fromJson(str.toUtf8()).object();
3、QJsonArray转QString
QString str = QJsonDocument(arr).toJson(QJsonDocument::Compact).constData();
4、QString转QJsonArray
QJsonArray arry = QJsonDocument::fromJson(str.toUtf8()).array();
-
git init git add . git commit -m "first commit" git remote add origin git@github.com:你的账号/仓库名称.git git branch -M main git push -u origin main
-
这是我最后的配置命令
configure.bat -confirm-license -opensource -platform win32-msvc -mp -debug-and-release -static -prefix "D:\QT5_STATIC_SSL" -sql-mysql -openssl-linked -qt-sqlite -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -qt-pcre -qt-harfbuzz -no-qml-debug -no-angle -nomake tests -nomake examples -skip wayland -skip qtwebengine -I "D:\QT5\openssl\include" -L "D:\QT5\openssl\lib" -I "D:\MySQL\55\include" -L "D:\MySQL\55\lib"
-
下载openssl,https://www.openssl.org/source/openssl-1.1.1o.tar.gz
使用x86 Native Tools Command Prompt for VS 2019进入openssl源码目录
输入命令:perl Configure VC-WIN32 no-asm --prefix=D:\QT5\openssl
执行:nmake
执行nmake install
重新解压Qt源码包,重新编译一次
configure.bat -static -prefix "D:\QT5_STATIC_SSL" -confirm-license -opensource -debug-and-release -platform win32-msvc -nomake examples -nomake tests -plugin-sql-mysql -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -mp -ssl -openssl-linked OPENSSL_PREFIX=D:\QT5\openssl
这样,这次的静态编译就得到了支持ssl的静态Qt
-
切记一定要把openssl编译进去
SSL support.................yes OpenSSL support.............yes
-
本来一直以来,一些小工具,我都是用c#来写的,昨天用c#操作mysql一直出问题,貌似我的connection不可以重复使用,google了下也没找到解决方案,于是我退而求其次,看看c#怎么操作mysql的,结果也都是一些玩具一样的代码,于是怒从心头起,恶向胆边生,索性静态编译下Qt去开发以后这些小工具。
于是昨天晚上十点,我输入了nmake后敲了回车,于是凌晨1点我还在等,后来困得不行就睡了。早上起来又敲的nmake install,到了公司后又配置的KIT,写了一个小程序,测试成功。
这里有一点需要注意的是,静态编译无法动态载入链接库,所以,在nmake之前,必须确保想要的库是yes状态,
下面是我的静态编译过程,没啥不一样的,就是按照网上的教程一步步来就成功了。
下载:qt-everywhere-src-5.15.2.zip, 大小:962 MB (1,009,224,272 字节) 下载地址:https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.zip
新建一个文件夹用来存放静态编译后的Qt,比如:D:\QT5_STATIC
我编译的是32位的MSVC版本的Qt
首先,在开始菜单中,搜索:x86 Native Tools Command Prompt for VS 2019,打开,进入src目录
安装perl
我安装的是:strawberry-perl-5.32.1.1-32bit.msi,下载地址是:https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-32bit.msi
安装python,我安装的是python-2.7.8.msi,下载地址是:https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi
修改:D:\QT5\qt-everywhere-src-5.15.2\qtbase\mkspecs\common\msvc-desktop.conf
QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MD QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD QMAKE_CFLAGS_DEBUG = -Zi -MDd
修改为:
QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MT QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT QMAKE_CFLAGS_DEBUG = -Zi -MTd
在刚才的 x86 Native Tools Command Prompt for VS 2019 工具里输入:
configure.bat -static -prefix "D:\QT5_STATIC" -confirm-license -opensource -debug-and-release -platform win32-msvc -nomake examples -nomake tests -plugin-sql-mysql -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -mp
然后输入:
nmake
这个可能需要1-4个小时不等
成功后输入:
nmake install
完成后就成功了,接下来就是QtCreator配置kit了
-
public Form1() { InitializeComponent(); StopProcess(); set_date(); } //防止多开,保证只有一个exe在运行 private void StopProcess() { Process current = Process.GetCurrentProcess(); Process[] pp = Process.GetProcessesByName(current.ProcessName); foreach (Process p in pp) { if (p.Id != current.Id) { if (p.MainModule.FileName == current.MainModule.FileName) { p.Kill(); return; } } } }
-
如果:QSqlDatabase::drivers() 结果里面有QMYSQL,但是依然提示:“QSqlDatabase: QMYSQL driver not loaded”
将你的MySQL的安装目录的lib文件夹下的libmysql.dll拷贝到你的Qt安装目录下的bin目录下
然后重启Qt
-
主要原因还是数据库的dll版本不对造成的,参考网址:
https://blog.csdn.net/Lvcxiao/article/details/118631612
http://www.cppblog.com/jack-wang/archive/2021/10/15/217833.html
-
在做一个Qt的项目的时候,需要本地存储一些数据,本来第一选择是sqlite的,但是我读取的时候,发现同样的sql,Qt读取的结果和navicat读取的结果不一样。
也没找到为什么不一样,研究再三没有找到原因,于是放弃了sqlite,转而使用mysql
结果提示我:“QSqlDatabase: QMYSQL driver not loaded”
首先打印出来支持的数据模块:
qDebug() << QSqlDatabase::drivers();
结果中并没有mysql,于是百度和谷歌都去搜索了下,谷歌还专门用英文去搜索了下,发现大部分的网站抄来抄去的解决方案是复制mysql下的dll到qt的对应的目录下,
我试了下,没有任何作用,错误提示依旧
于是再找,终于找到了一个网页的方案,并且测试成功了。
解决方案如下。
首先,Qt安装的时候需要选中源码,这样才会再Qt的目录下有src目录。我的Qt在D盘下面,所以我的src目录是:
D:\QT5\5.15.2\Src
打开下面这个目录:
D:\QT5\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql
类似如下:
双击:mysql.pro,Qt会自动打开这个项目。
编辑pro文件,编辑后的代码如下:
TARGET = qsqlmysql HEADERS += $$PWD/qsql_mysql_p.h SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp #QMAKE_USE += mysql OTHER_FILES += mysql.json PLUGIN_CLASS_NAME = QMYSQLDriverPlugin include(../qsqldriverbase.pri) # mysql安装目录下的include文件夹 INCLUDEPATH += "D:/MySQL/55/include" # mysql安装目录下的lib文件夹下的libmysql.lib文件 LIBS += "D:/MySQL/55/lib/libmysql.lib" # 编译后的dll存放的位置 DESTDIR = "D:\QT5\5.15.2\MysqlDll"
然后编辑,然后去D:\QT5\5.15.2\MysqlDll看下
结果如下:
复制这个文件夹下所有的文件到:
D:\QT5\5.15.2\msvc2019\plugins\sqldrivers
我用的是msvc2019_32 所以拷贝到这个目录,如果你说64位,可能需要复制到:msvc2019_64,mingw的话就复制到:mingw81_32或者mingw81_64
重启Qt后,就没问题了。
下面是我的单例DB
#pragma execution_character_set("utf-8") #include "db.h" #include <QCoreApplication> #include <QMutex> #include <QDebug> #include <QMessageBox> Db::Db(QObject *parent) : QObject(parent) { qDebug() << QSqlDatabase::drivers(); db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("127.0.0.1"); db.setUserName("root"); db.setPassword("123456"); db.setDatabaseName("disk"); if (!db.open()) { QString err = "Error: Failed to connect database."; QMessageBox msgBox; msgBox.setText(err); msgBox.exec(); } } Db *Db::Instance() { static QMutex mutex; static QScopedPointer<Db> inst; if (Q_UNLIKELY(!inst)) { mutex.lock(); if (!inst) { inst.reset(new Db); } mutex.unlock(); } return inst.data(); } bool Db::isOpen() { if (!db.open())//判断数据库是否打开 { qDebug() << "db open faild! err:" << db.lastError(); return false; } qDebug() << "数据库打开成功"; return true; } void Db::query(QString sql) { QSqlQuery sql_query; sql_query.exec(sql); }
最后输出如下:
("QSQLITE", "QMARIADB", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7") 数据库打开成功
-- 结束 --
-
qDebug() << "QSslSocket::sslLibraryBuildVersionString()" << QSslSocket::sslLibraryBuildVersionString(); qDebug() << "QSslSocket::sslLibraryVersionString()" << QSslSocket::sslLibraryVersionString(); qDebug() << "Supports SSL: " << QSslSocket::supportsSsl();
请阿杜喝杯咖啡
在 转贴交流
发布于