1.zlib Դ?源码?????
2.å¦ä½å¨ubuntuä¸å®è£
zlibåzlib-devel
3.å¦ä½å¨linuxå¹³å°ä¸ç¼è¯å®è£
zlib软件ï¼
4.å¦ä½å¨linuxå¹³å°ä¸ç¼è¯å®è£
zlib软件
5.Nginx系列:依赖安装(pcre,zlib,openssl)(2)
6.64位系统上源码编译32位libcurl库
zlib Դ??????
研究开发Electron过程中,发现程序在Windows环境下运行无误,下载但在Linux和macOS系统中遇到问题,源码主要源于依赖的下载第三方插件只提供exe程序。为了解决这一问题,源码开始探索如何使用C++等源码编译出适用于Windows、下载桌面宠物游戏源码下载Linux、源码macOS的下载二进制应用程序。
经过一周的源码学习与实践,终于掌握如何编译Linux和Windows应用程序,下载但尚未精通在单一系统环境下编译出Windows、源码Linux、下载macOS兼容的源码程序。当前主要涉及交叉编译技术,下载正深入研究以期获得完整流程,源码以便后续发布相关教程。
开始准备工具,包括Windows 操作系统、CMake、Visual Studio 等。学习过程分为几个步骤:下载并解压libpng-1.6.源码,查看依赖zlib的leveldb源码分析版本信息,下载zlib-1.2.8源码,编译生成debug和release版本的静态链接库,并复制zlib-1.2.8/build/zconf.h文件到zlib-1.2.8目录下。随后,使用CMake编译libpng-1.6.,并生成适用于Windows和Linux的静态链接库。同样,遵循上述流程完成mozjpeg-4.0.3的编译。
对于使用MinGW编译的疑问,通过CMake GUI选择“MinGW Makefile”进行配置,等待配置完成并生成Makefile后,在命令行中执行相应的make命令。如果编译出的exe文件无法单独使用,需确保程序依赖的dll文件与exe文件放在同一目录,或使用.xxx-static.exe的命名格式,确保程序正常运行。
å¦ä½å¨ubuntuä¸å®è£ zlibåzlib-devel
å¨ubuntu软件æºézlibåzlib-develå«åzlib1g zlib1g.dev
$ sudo apt-get install zlib1g
$ sudo apt-get install zlib1g.dev
ç´æ¥è¾å ¥ä¸è¿°å½ä»¤åè¿æ¯ä¸è½å®è£ ãè¿å°±è¦æ±æ们å è£ ruby.
å¨ubuntuéï¼zlibå«zlib1gï¼ç¸åºçzlib-develå«zlib1g.devãé»è®¤çå®è£ æºé没æzlib1g.devãè¦å¨packages.ubuntu.comä¸æ¾ã
$sudo apt-get install ruby
ç¶ååè£ zlib1g-devå°±å¯ä»¥äº
$sudo apt-get install zlib1g-dev
å¦ä½å¨linuxå¹³å°ä¸ç¼è¯å®è£ zlib软件ï¼
æ³è¦å¨linuxå¹³å°ä¸ç¼è¯å®è£ zlib软件ï¼ä½ éè¦æç´¢zlibå®æ¹ç½ç«ï¼ä¸è½½æºç æ¥å®è£ zlib软件å è¿è¡å®è£ å³å¯ãLinuxæ¯ä¸å¥å 费使ç¨åèªç±ä¼ æçç±»Unixæä½ç³»ç»ï¼æ¯ä¸ä¸ªåºäºPOSIXåUNIXçå¤ç¨æ·ãå¤ä»»å¡ãæ¯æå¤çº¿ç¨åå¤CPUçæä½ç³»ç»ãå®è½è¿è¡ä¸»è¦çUNIXå·¥å ·è½¯ä»¶ãåºç¨ç¨åºåç½ç»åè®®ãå®æ¯æä½åä½ç¡¬ä»¶ãLinux继æ¿äºUnix以ç½ç»ä¸ºæ ¸å¿ç设计ææ³ï¼æ¯ä¸ä¸ªæ§è½ç¨³å®çå¤ç¨æ·ç½ç»æä½ç³»ç»ã
zlibæ¯æä¾æ°æ®å缩ç¨çå½å¼åºï¼ç±Jean-loup Gaillyä¸Mark Adleræå¼åï¼åç0.9çå¨å¹´5æ1æ¥å表ãzlib使ç¨DEFLATEç®æ³ï¼æåæ¯ä¸ºlibpngå½å¼åºæåçï¼åæ¥æ®é为许å¤è½¯ä»¶æ使ç¨ãæ¤å½å¼åºä¸ºèªç±è½¯ä»¶ï¼ä½¿ç¨zlibææãæªè³å¹´3æï¼zlibæ¯å å«å¨Coverityçç¾å½å½åå®å ¨é¨èµå©è éæ©ç»§ç»å®¡æ¥çå¼æºé¡¹ç®ã
å¦ä½å¨linuxå¹³å°ä¸ç¼è¯å®è£ zlib软件
æ索并ä¸è½½zlibæºç å
1
å¨linuxå½ä»¤è¡ä¸æ¥è¯¢ä¸ä¸zlibç软件å°åï¼ç¶å使ç¨æµè§å¨æå¼å³å¯ï¼å¦ä¸å¾æ示
大家ä¹å¯ä»¥å¨ç¾åº¦ä¸è¿è¡æç´¢ï¼ä¸è¿ä¸å®è¦æ³¨æå®å ¨å¦ï¼é¿å ä¸è½½å°ä¸äºä¸å¹²åç软件ï¼æ以è¿ç¹éè¦æ³¨æä¸ä¸
ãåèèµæåé¢éå®ç½ä¸è½½å°åã
END
Gccç¼è¯å®è£ zlibæºç å 并é 置使ç¨
使ç¨tar å½ä»¤è¿è¡è§£ååºæ¥ï¼ç¶åè¿å ¥å°å®è£ ç®å½ï¼å¦ä¸å¾æ示
tar zxf zlib-1.2.8.tar.gz
cd zlib-1.2.8
使ç¨./configure --helpå¯ä»¥æ¥çç¼è¯çé项ï¼æ们è¿é使ç¨ç®åçé项å®è£ å³å¯
è¿å ¥å®è£ æ件ç®å½ï¼ç¶å 使ç¨å¦ä¸å½ä»¤è¿è¡å®è£
./configure --prefix=/data/progam/zlib
make
make install
å¦ä¸å¾æ示
åè¿è¡é ç½®ä¸ä¸ç³»ç»çæ件ï¼å è½½åæç¼è¯å®è£ çzlibçæçåºæ件
vi /etc/ld.so.conf.d/zlib.conf
å å ¥å¦ä¸å 容åä¿åéåº
/data/program/zlib/lib
==============================
ä¹å°±æ¯æ·»å å®è£ ç®å½çæ件路å¾ï¼åºæ件ãldconfig è¿è¡ä¹åå°±ä¼å è½½å®è£ çåºæ件äºã
Nginx系列:依赖安装(pcre,zlib,openssl)(2)
上一篇文章
在学习编译安装Nginx之前,必须安装好Nginx的依赖项,这些包括函数库和软件:pcre,zlib,openssl。商派源码
关键词:pcre/pcre2/pcre-devel安装,zlib/zlib-devel安装,openssl源码安装
特别提醒:
在安装软件时,使用:./configure,默认路径为:/usr/local/。建议在安装时指定路径:
./configure --prefix=/usr/local/pcre-8.-6/
./configure --prefix=/usr/local/zlib-1.2./
./configure --prefix=/usr/local/openssl-3.0.7/
便于后期删除软件,切换版本等。
特别提醒:
特别注意:Nginx不支持pcre2版本!
尽管先下载pcre2源码编译安装,但这里的步骤和截图以pcre2为例。
一,下载地址
官网: pcre.org,可下载最新版本
选择pcre版本即可,Nginx不支持pcre2,这里演示的是pcre2版本。
二,下载源码包
在官网找到对应的下载页,复制下载链接
cd /usr/local/src
mkdir pcre
cd pcre
wget –O ./pcre2-..tar.gz sourceforge.net/project...
说明:学习Linux的目录结构后,要养成规范使用的习惯,把源码放到/usr/local/src目录下
规范参看:
三,解压源码包
tar –zxvf pcre2-..tar.gz
四,c语言项目源码配置安装参数
cd pcre2-.
./configure –-help (可以查看很多安装的参数,自主进行选择)
./configure (一般直接默认配置就行,会生成Makefile,默认安装目录是/usr/local)
五,编译make
会调用刚才生成的编译文件Makefile
六,检查make check
这个命令可以跳过,部分软件没有make check命令
七,安装make install
直接执行安装即可
八,检查安装
cd /usr/local/lib
查看目录下有没有libpcre2的动态库文件
九,卸载软件/库
一般的软件都会在编译安装时,写好uninstall卸载指令
cd /usr/local/src/pcre/pcre2-.
make uninstall
则会把安装的函数库全部删除,完成卸载
十,重新编译和安装
先清除旧的安装参数配置和包残留
make clean(部分软件是make clean all)
再重回第三步:./configure进行配置即可
官网地址: zlib.net/,可下载最新版本
具体的安装流程与上面的pcre相同,不再详细描述,都是:
选择安装包,下载安装包,解压安装包,进入目录
执行./configure --> make --> make check --> make install
去安装目录(这里默认是/usr/lcoal/lib)检查是否存在zlib的so库
官网地址: /index.html (openssl.org),可下载最新版本
具体的安装流程与上面的pcre相同,不再详细描述,两性源码都是:
选择安装包,下载安装包,解压安装包,进入目录
执行./configure --> make --> make check --> make install
./configure可能会遇到一些问题:
执行:yum -y install perl-IPC-Cmd
说明:安装的openssl不是函数库,而是软件!
所以直接去安装目录(这里默认是/usr/local)下找openssl的目录
如果直接执行openssl version,可能会报找不到命令:那就是没有没有把安装目录加入系统环境
参看这篇文章:
或者显示的版本不是你安装的版本:那就是原本系统就装有openssl
我的做法是:
find / -name openssl 或者 whereis openssl
找到所有的openssl文件,函数库,执行软件等,都删除
再根据上面的方法重新安装,并配置系统环境
pcre-devel是使用PCRE做二次开发时所需要的开发库,包括头文件等,这也是编译Nginx所必须使用的
zlib-devel也是同样的作用
这2个我没有找到对应的源码安装包,所以只用使用yum安装了
yum -y install pcre-devel
yum -y install zlib-devel
这里也算是体现了源码安装 + yum安装结合的方式了
或许你可以看看这篇文章:
下一期详细写如何在Linux下源码编译安装Nginx,敬请期待!
位系统上源码编译位libcurl库
有时候需要交叉编译libcurl,比如目标机器是位系统的,但是本地机器是位系统的,而且由于某些原因,我们无法在位系统上直接编译,所以需要用到交叉编译
libcurl是依赖openssl的,所以先编译openssl的位库 完整编译选项配置如下:
详细选项含义如下:预先已经export CC的版本 配置-m指定编译位的库 配置–prefix指定openssl的安装目录 配置–openssldir指定openssl的头文件目录 配置shared关键字指定编译时生成动态库(libssl.so/libcrypto.so及其相关软连接)然后再make && make install即可
有时候有的系统是默认安装了位zlib库的,那么就可以跳过这一步,但是有的系统需要自己下载编译zlib-位库 完整编译选项配置如下:直接修改CMakeLists.txt文件,增加以下两行 set(CMAKE_C_FLAGS “-m”) set(CMAKE_CXX_FLAGS “-m”) 详细选项含义如下:配置CMAKE_C_FLAGS指定编译位库环境 配置CMAKE_CXX_FLAGS指定编译位库环境然后再mkdir build && cd build && cmake .. && make && make install即可
最后就是编译libcurl 完整编译选项配置如下:
详细选项含义如下:配置PKG_CONFIG_PATH指定启动openssl选项(启动这个选项,就会默认链接lssl,lcrypto,lz三个库) 配置CFLAGS指定编译位库环境 配置CPPFLAGS指定链接的库的头文件 配置LDFLAGS指定链接的库的路径然后再make && make install即可
当编译第三方库的时候,如果有CMakeLists.txt,直接用CMakeLists.txt编译就很方便;如果只有configure,那么需要先了解编译选项执行./configure –help来查看当前支持的编译选项然后根据提示配置一下我们需要指定的选项,比如自己指定的openssl的版本的库和头文件路径名,比如CC的版本,比如安装路径等等 (当然,如果不需要额外配置这些东西的话,直接走默认配置的话,那么直接执行./config或者./configure就行)然后在生成Makefile之后,再make && make install即可
zlibrary种子的全套下载流程,附下载和改名工具
zlibrary电子书资源丰富,包含多种格式,但因访问受限,下载本地保存更为稳定。获取种子链接如下,使用夸克网盘分享,密码为zlib。共有个种子,其中个为电子书资源,2个包含index的文件为索引文件。下载电子书资源后,需借助索引文件修改书名与格式后缀。为简化流程,先行者提供了索引文件与改名工具,无需额外下载,仅需电子书资源即可。
种子分为zlib与zlib2,容量分别为7T与T,合计T。若提取中文书籍,zlib需0.9T,zlib2需.T,总需.T。去除格式重复的书籍后,保留EPUB格式,实际储存空间需求约8T(中文EPUB书籍)。注意,解压缩需要T以上硬盘空间,以避免解压缩过程中的不便。
推荐下载器有uTorrent、BitComet、迅雷与qBittorrent,其中qBittorrent下载速度最快。使用方法:将种子复制,点击qbittorrent软件左上角的图标添加下载任务。下载后,需解压种子文件。随后,使用提供的改名工具进行书籍改名,该工具将索引文件中的书籍信息转换为正确的文件名与格式。完成改名后,书籍将提取至chinese文件夹中。注意,该工具仅支持中文书籍的处理。
若需所有语种书籍的改名处理,推荐使用钥匙挂大佬分享的工具。此工具专门用于改名,不涉及文件提取。针对特定格式需求,可使用自定义的app去除不需要的格式,节省空间。此app的源码已收录,感兴趣者可深入研究。
在获取资源与使用过程中,请确保了解版权与法律限制,合理使用资源,切勿用于非法盈利。相关资源与技术探讨,可参考知乎上的相关文章与回答。
实现web服务器中的gzip
web服务器实现压缩数据发送给浏览器
web服务器使用gzip压缩可以提高网站的响应速度,因为数据压缩会消耗一定的cpu及I/O的。但是可以减少通过网络传输的数据量。
从而提高网站的浏览速度
本程序本人自己在ubuntu中编译成功,在ubuntu中经过Firefox中,window 系统IE 8,Firefox、chrome中测试成功。
本程序需要用到zlib压缩类库,没有装将无法成功,本人只提供在ubuntu中的代码及运行方式。希望大家谅解。关于用到的
zlib库中的知识,稍后会出新的博客做解释,关于gzip压缩的头部请看另外一篇博客 gzip头部格式。
源码及makefile下载地址:tl.h#include string.h#include sys/stat.h#include signal.h#include stdio.h#include string.h#include assert.h#include zlib.h#define OS_CODE 0x /*Unix OS_CODE*/#define DEFAULT_COMPRESSION Z_DEFAULT_COMPRESSION#define DEFAULT_WINDOWSIZE -#define DEFAULT_MEMLEVEL 9#define DEFAULT_BUFFERSIZE #define MAX #define METHOD //获取数据的方式,使用字符串的长度#define URI //表示URI的最大长度#define VERSION //HTTP版本好的最大长度#define TYPE //表示文件的类型的长度int res_socket;void app_exit();static const char gzip_header[] = { '', '', Z_DEFLATED, 0, 0, 0, 0, 0, 0, OS_CODE};void put_long (unsigned char *string, unsigned long x) { string[0] = (x 0xff); string[1] = ((x 8) 0xff) ; string[2] = ((x ) 0xff) ; string[3] = ((x ) 0xff);}/*@description:将数据使用gzip压缩后发给浏览器@parametersockd:套接字file: 要压缩的内容了*/int gzip_buffer (int sockd, char * msg, int len) { z_stream stream;//zlib使用的。 int ret, flush; char in[MAX];//存放输入的数据 char send[MAX + ];//存放压缩过后的数据 unsigned have; memcpy (send, gzip_header, ); memset (in, 0, len); stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = 0; stream.next_in = Z_NULL; memcpy (in, msg, len); //压缩初始化。 int tmp_result = deflateInit2(stream, Z_DEFAULT_COMPRESSION,//压缩级别 Z_DEFLATED,//压缩方式 -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); if (Z_OK != tmp_result) { printf("deflateInit error: %drn", tmp_result); return 0; } stream.avail_in = len; //要压缩数据的长度 stream.next_in = in; //要压缩数据的首地址 stream.avail_out = MAX; //可存放的最大输出结果的长多。就是压缩后数据的最大长度 stream.next_out = send + ; //存放压缩数据的开始位置,send前十个字节用来放头部 ret = deflate (stream,Z_FINISH); //压缩 assert (ret != Z_STREAM_ERROR); switch (ret) { case Z_NEED_DICT: ret = Z_DATA_ERROR; case Z_DATA_ERROR: case Z_MEM_ERROR: (void)inflateEnd (stream); return ret; } have = MAX - stream.avail_out; unsigned crc = crc(0L, in, len); char * tail = send + + have; put_long (tail, crc); put_long (tail + 4, len); write (sockd, send, have + ); deflateEnd (stream); return 1;}/* @description:开始服务端监听@parameterip:web服务器的地址port:web服务器的端口@result:成功返回创建socket套接字标识,错误返回-1*/int socket_listen( char *ip, unsigned short int port){ int res_socket; //返回值 int res, on; struct sockaddr_in address; struct in_addr in_ip; res = res_socket = socket(AF_INET, SOCK_STREAM, 0); setsockopt(res_socket, SOL_SOCKET, SO_REUSEADDR, on, sizeof(on)); memset(address, 0, sizeof(address)); address.sin_family = AF_INET ; address.sin_port =htons(port); address.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr(".0.0.1"); res = bind( res_socket, (struct sockaddr *) address, sizeof( address ) ); if(res) { printf( "port is used , not to repeat bindn" ); exit(); }; res = listen(res_socket,5); if(res) { printf( "listen port is error ;n" ); exit( ); }; return res_socket ;}/*@description:向客户端发送网页头文件的信息@parameterconn_socket:套接字描述符。status:/rentiansheng"Reage blog/a"; res_socket = socket_listen( ".0.0.1", ) ; //当按ctrl+c结束程序时调用,使用app_exit函数处理退出过程 signal(SIGINT, app_exit); while(1){ conn_socket = accept( res_socket, (struct sockaddr * )client_addr, len ); printf("reagen"); tmp = read (conn_socket, buf, MAX-1); buf [MAX - 1] = 0; send_http_head(conn_socket); gzip_buffer (conn_socket, msg, strlen(msg)); close(conn_socket); } }void app_exit(){ //回复ctrl+c组合键的默认行为 signal (SIGINT, SIG_DFL); //关闭服务端链接、释放服务端ip和端口 close(res_socket); printf("n"); exit(0);}