MinGW 编译zlib、libpng、libjpeg等

本文详细介绍了如何在MinGW环境下编译多种常用库,包括zlib、libpng、libjpeg等,并提供了具体步骤及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


MinGW

这里使用的是Qt5自带的MinGw版本,将路径D:\Qt\Qt5.1.0\Tools\mingw48_32\bin加到"环境变量"→"系统变量"→"Path"
命令行输入:

1
gcc -v

可看到gcc版本为:gcc version 4.8.0 (rev2, Built by MinGW-builds project)

MSYS

下载地址:http://www.mingw.org/wiki/MSYS
当前版本:1.0.11
一路安装下去即可

zlib

下载地址:http://www.zlib.net/
当前版本:1.2.8
命令行输入:

1
2
copy win32\makefile.gcc makefile.gcc
mingw32-make -f makefile.gcc

生成libz.a文件

libpng

下载地址:http://www.libpng.org/pub/png/libpng.html
当前版本:1.6.6
打开scripts/makefile.gcc设置zlib路径:

1
2
ZLIBINC = ../zlib-1.2.8
ZLIBLIB = ../zlib-1.2.8

拷贝scripts/pnglibconf.h.prebuilt到源码目录,改名为pnglibconf.h
命令行输入:

1
2
copy scripts\makefile.gcc makefile.gcc
mingw32-make -f makefile.gcc

生成libpng.a文件

libjpeg

下载地址:http://www.ijg.org/
当前版本:9
打开MSYS (rxvt),输入:

1
2
3
cd /f/mycode/mysvn/jpeg-9
./configure
make

若是出现以下错误:

1
2
jcapimin.c:127:1: error: conflicting types for 'jpeg_suppress_tables'
 jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)

打开jconfig.h,增加以下定义:

1
#define HAVE_PROTOTYPES 1

重新输入:

1
make

在.libs文件夹下生成libjpeg.a文件

libtiff

下载地址:ftp://ftp.remotesensing.org/pub/libtiff
当前版本:4.0.3
编译依赖zlib和libjpeg,打jpeg-9/jconfig.h,定义如下:

1
2
#define HAVE_UNSIGNED_CHAR
#define HAVE_UNSIGNED_SHORT

打开MSYS (rxvt),输入:

1
./configure --with-zlib-include-dir=/f/mycode/mysvn/zlib-1.2.8 --with-zlib-lib-dir=/f/mycode/mysvn/zlib-1.2.8 --with-jpeg-include-dir=/f/mycode/mysvn/jpeg-9 --with-jpeg-lib-dir=/f/mycode/mysvn/jpeg-9/.libs

接着输入:

1
make

在libtiff/.libs文件夹下生成libtiff.a文件

libiconv

下载地址:http://www.gnu.org/software/libiconv/
当前版本:1.14
打开MSYS (rxvt),输入:

1
2
3
cd /f/mycode/mysvn/libiconv-1.14
./configure
make

在lib/.libs文件夹下生成libiconv-2.dll和libiconv.dll.a文件,这是动态库。

GLEW

下载地址:http://glew.sourceforge.net/
当前版本:1.10.0
打开Makefile,更改SYSTEM变量为:

1
SYSTEM ?= mingw

命令行输入:

1
mingw32-make -f Makefile

在lib文件夹生成libglew32.a、libglew32.dll.a和glew32.dll文件
MinGW使用-lxxx来链接库的时候,搜索库的顺序如下:

1
2
3
4
5
6
libxxx.dll.a 
xxx.dll.a 
libxxx.a 
cygxxx.dll (*) 
libxxx.dll 
xxx.dll

测试使用,新建Qt工程,pro内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
QT       += core
QT       -= gui

TARGET = testc11
CONFIG   += console
CONFIG   -= app_bundle
CONFIG   += c++ 11

TEMPLATE = app

# 链接GLEW静态库版本时开启
#DEFINES += GLEW_STATIC
INCLUDEPATH +=  E:/MyControl/glew- 1. 10. 0/include
LIBS += -lglew32 -lopengl32 -LE:/MyControl/glew- 1. 10. 0/lib

SOURCES += main.cpp

main.cpp内容如下:

1
2
3
4
5
6
7
8
9
#include  "GL/glew.h"
#include <QCoreApplication>

int main( int argc,  char *argv[])
{
    glewInit();
    QCoreApplication a(argc, argv);
     return a.exec();
}

编译运行成功,它链接的是libglew32.dll.a,运行需要glew32.dll动态库支持。接下来测试链接静态库,取消pro文件里面的注释,然后将E:\MyControl\glew-1.10.0\lib文件夹下的libglew32.dll.a文件暂时移出此文件夹,以防止被链接到。重新编译运行,此时链接到了静态库libglew32.a文件。

libwebp

下载地址:https://developers.google.com/speed/webp
当前版本:0.3.1
打开makefile.unix文件,注释掉以下四行,如下:

1
2
3
4
#EXTRA_FLAGS= -DWEBP_HAVE_PNG -DWEBP_HAVE_JPEG -DWEBP_HAVE_TIFF
#DWEBP_LIBS= -lpng -lz
#CWEBP_LIBS= $(DWEBP_LIBS) -ljpeg -ltiff
#GIF_LIBS = -lgif

命令行输入:

1
mingw32-make -f makefile.unix

在src文件夹下生成libwebp.a文件

libcurl

下载地址:http://curl.haxx.se/
当前版本:7.33.0
命令行输入:

1
mingw32-make mingw32

在lib文件夹下生成libcurl.a文件
测试静态库使用,新建Qt工程,pro内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QT       += core
QT       -= gui

TARGET = testc11
CONFIG   += console
CONFIG   -= app_bundle
CONFIG   += c++11

TEMPLATE = app

DEFINES += CURL_STATICLIB
INCLUDEPATH += E:/MyControl/curl-7.33.0/include
LIBS += -LE:/MyControl/curl-7.33.0/lib -lcurl -lws2_32 -lwldap32

SOURCES += main.cpp

main.cpp内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include  "curl/curl.h"
#include <QCoreApplication>

int main( int argc,  char *argv[])
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
     if(curl) {
      curl_easy_setopt(curl, CURLOPT_URL,  "http://example.com");
       /* example.com is redirected, so we tell libcurl to follow redirection */
      curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

       /* Perform the request, res will get the return code */
      res = curl_easy_perform(curl);
       /* Check for errors */
       if(res != CURLE_OK)
        fprintf(stderr,  "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));

       /* always cleanup */
      curl_easy_cleanup(curl);
    }

    QCoreApplication a(argc, argv);
     return a.exec();
}

编译运行,可见打印出了网页源码。

FreeType

下载地址:http://www.freetype.org
当前版本:2.5.0
打开MSYS (rxvt),输入:

1
2
3
cd /e/mycontrol/freetype-2.5.0
./configure --without-png
make

在objs\.libs文件夹下生成libfreetype.a文件


参考资料:

1.在 mingw 下编译 libHaru http://kingsz1.iteye.com/blog/543787
2.NDK在windows下编译libpng http://www.scottcgi.com/2012/12/31/ndk%E5%9C%A8windows%E4%B8%8B%E7%BC%96%E8%AF%91libpng/
3.mingw_how_to http://www.gaia-gis.it/spatialite-2.4.0/mingw_how_to.html
4.compile libjpeg with mingw http://stackoverflow.com/questions/13087749/compile-libjpeg-with-mingw
5.Using ld, the Gnu Linker https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/win32.html

<think>好的,我需要帮助用户了解如何在QtMinGW环境下编译libzip库。首先,我需要回顾用户提供的引用资料,看看是否有相关的编译步骤可以参考。用户提到了MinGW编译zliblibpnglibjpeg等库的步骤,以及Qt环境下编译zlib和quazip的方法。这些信息可能对编译libzip有帮助,因为libzip依赖zlib,而用户可能已经熟悉这些编译流程。 首先,我需要确认libzip的依赖项。根据官方文档,libzip需要zlib、BZip2(可选)、OpenSSL(可选)和CMake。用户之前编译zlib,所以可能需要先编译zlib,并确保它的路径正确。接下来,用户使用MinGWQt的环境,可能需要设置正确的工具链,比如使用MinGW的gcc和make。 然后,我需要检查用户提供的引用中的编译步骤。例如,引用[2]中提到拷贝pnglibconf.h.prebuilt并重命名,然后使用makefile.gcc进行编译。这可能意味着在编译某些库时需要预处理步骤,比如复制配置文件。类似地,引用[3]和[4]提到了使用makefile.gcc和mingw32-make命令,这可能在libzip的编译中也是适用的步骤。 接下来,我需要考虑用户的环境配置是否正确。用户使用QtMinGW工具链,需要确保QtMinGW版本与编译libzip所需的工具链兼容。例如,用户可能需要将MinGW的bin目录添加到系统PATH中,以便能够调用gcc、make等命令。 然后,我需要规划编译libzip的具体步骤。可能包括下载源码、配置CMake、生成Makefile、执行编译和安装。用户可能需要设置zlib的路径,例如通过设置CMAKE_PREFIX_PATH或者指定zlib的include和lib目录。此外,可能需要处理Windows下的路径问题,比如使用反斜杠或正斜杠。 在编写步骤时,需要注意用户可能遇到的常见问题,比如找不到zlib头文件或链接库,或者CMake生成配置失败。可能需要指导用户如何检查这些配置,例如通过CMake的输出信息,或者手动指定zlib的位置。 最后,用户可能需要将编译好的libzip库集成到Qt项目中,这包括在.pro文件中添加INCLUDEPATH和LIBS路径,并确保动态链接库(DLL)在运行时可用。可能需要提醒用户将生成的DLL文件复制到应用程序目录下,或者设置环境变量。 总结起来,步骤可能包括: 1. 安装依赖项,如zlib,并确保其正确编译。 2. 下载libzip源码。 3. 使用CMake配置生成Makefile,指定MinGW工具链和zlib路径。 4. 使用mingw32-make进行编译和安装。 5. 在Qt项目中配置libzip的路径和链接库。 需要确保每一步都清晰,并参考用户之前的经验,比如使用makefile.gcc和mingw32-make命令。同时,需要提醒用户注意路径的正确性,特别是在Windows环境下可能出现的斜杠问题,以及确保所有依赖项都被正确找到。</think>### 使用 libzip 在 QtMinGW 环境下的编译指南 以下步骤基于 MinGW 工具链和 Qt 环境配置,结合您提供的引用内容[^1][^2][^3][^4],整理出 libzip 的编译方法: --- #### **1. 环境准备** - **MinGW 工具链**:确保已安装 Qt 自带的 MinGW(例如 `mingw73_32` 或 `mingw81_64`),并将其 `bin` 目录添加到系统 `PATH` 变量中。 - **依赖库**: - **zlib**:需提前编译 zlib(参考引用[^4]),生成 `zlib.h`、`zconf.h` 和 `libz.dll.a`,并将头文件与库文件分别放在 `include` 和 `lib` 目录中。 - **CMake**:安装 CMake 用于生成构建文件。 --- #### **2. 编译 libzip** **步骤 1:下载源码** 从 [libzip 官方仓库](https://libzip.org/) 下载源码并解压。 **步骤 2:CMake 配置** 打开命令行,进入源码目录,执行以下命令: ```bash mkdir build && cd build cmake -G "MinGW Makefiles" \ -DCMAKE_INSTALL_PREFIX=./install \ -DCMAKE_PREFIX_PATH="C:/path/to/zlib" \ -DENABLE_OPENSSL=OFF \ -DBUILD_SHARED_LIBS=ON \ .. ``` **关键参数说明**: - `-G "MinGW Makefiles"`:指定生成 MinGW 兼容的 Makefile[^3]。 - `-DCMAKE_PREFIX_PATH`:指向 zlib 的安装目录(包含 `include` 和 `lib` 子目录)。 - `-DENABLE_OPENSSL=OFF`:若无需加密支持,关闭 OpenSSL 依赖。 **步骤 3:编译与安装** ```bash mingw32-make -j4 # 编译,-j4 表示使用4线程加速 mingw32-make install # 安装到 ./install 目录 ``` 编译完成后,`install` 目录会包含 `include`(头文件)和 `lib`(库文件如 `libzip.dll.a`)。 --- #### **3. 在 Qt 项目中集成 libzip** **步骤 1:配置项目文件(.pro)** 在 Qt 项目的 `.pro` 文件中添加以下内容: ```qmake INCLUDEPATH += "C:/path/to/libzip/install/include" LIBS += -L"C:/path/to/libzip/install/lib" -lzip -lz ``` **说明**: - `-lzip` 链接 libzip 动态库,`-lz` 链接 zlib 库。 **步骤 2:部署动态库** 将 `libzip.dll`(位于编译后的 `bin` 目录)复制到 Qt 项目的可执行文件目录中,确保运行时能找到依赖。 --- #### **常见问题解决** 1. **CMake 报错找不到 zlib** - 检查 `CMAKE_PREFIX_PATH` 是否指向正确的 zlib 路径,确保包含 `include/zlib.h` 和 `lib/libz.dll.a`。 - 手动指定路径: ``` -DZLIB_INCLUDE_DIR="C:/zlib/include" -DZLIB_LIBRARY="C:/zlib/lib/libz.dll.a" ``` 2. **链接错误:undefined reference** - 确认 `LIBS` 中库的顺序:`-lzip` 必须在 `-lz` 之后,以解决依赖关系[^4]。 --- #### **相关拓展问题** 1. 如何在 libzip 中实现 ZIP 文件的加密和解密? 2. 如何静态编译 libzip 以减少运行时依赖? 3. libzip 与其他压缩库(如 quazip)的性能对比如何? : MinGW 编译 zliblibpnglibjpeg 的通用流程。 : 使用预构建配置文件和 Makefile.gcc 的方法。 : MinGW 环境下动态库编译的典型命令。 : 头文件与库文件的部署路径对 Qt 项目的影响。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值