zoukankan      html  css  js  c++  java
  • Windows7 64下MinGW64/MSYS环境搭建

    原文出处:
    CompileGraphics Magick, Boost, Botan and QT with MinGW64 under Windows 7 64

    http://www.kineticsystem.org/?q=node/19

    译文出处:

    http://blog.csdn.net/cheungmine/article/details/8918808


    1 安装MSYS
    从下面的地址下载并运行:mingw-get-setup.exe

    http://sourceforge.net/projects/mingw/files/latest/download?source=files

    选择安装msys base和mingw developer toolkit.

    安装目录在本文中为C:DEVPACKMinGW.
    安装完毕之后运行下面的命令行:
    C:DEVPACKMinGWmsys1.0msys.bat
    逐条输入下面的语句,执行安装软件包:

    1
    2
    3
    4
    5
    mingw-get install msys-rxvt 
    mingw-get install msys-wget 
    mingw-get install msys-zip
    mingw-get install msys-unzip 
    mingw-get install msys-xz 

    右键点击文件C:DEVPACKMinGWmsys1.0msys.bat,在桌面上创建快捷方式, 并在"msys.bat - 快捷方式" 上点击右键, 目标后面添加--rxvt

    2 安装rubenvb MinGW-w64
    1)从下面的链接进入下载页面:

    http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/rubenvb/gcc-4.8-release/

    下载(为64位Windows编译原生64位):

    x86_64-w64-mingw32-gcc-4.8.0-win64_rubenvb.7z

    2)从下面的链接进入下载页面:

    http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/rubenvb/gcc-4.8-release/

    下载(为32位Windows编译,也可以运行在Win64上):

    i686-w64-mingw32-gcc-4.8.0-win64_rubenvb.7z

    包的命名规范是:

    [i686-w64-mingw32]-[gcc-4.8.0]-[win64]_rubenvb

    [目标平台]-[gcc-4.8.0]-[工具链OS]_rubenvb

    目标平台指MinGW最终编译好的二进制代码运行的平台,[i686...]表示Win32平台,[x86_64-...]表示Win64平台。工具链OS表示你安装MinGW的计算机OS。

    例如,如果想在WinXP32位平台上编译运行于Win7 64位平台的程序或库(dll),需要选择:x86_64-w64-mingw32-gcc-4.8.0-win32_rubenvb.7z。

    因为我的机器是64位Win7,因此我选择了上面2个包。解压后得到:

    1
    2
    C:DEVPACKMinGWmingw32 
    C:DEVPACKMinGWmingw64 

    另外添加3个目录如下,用于存放特定的工具链:

    1
    2
    3
    C:DEVPACKMinGWopt 
    C:DEVPACKMinGWlocal32 
    C:DEVPACKMinGWlocal64 

    修改文件C:DEVPACKMinGWmsys1.0etcfstab如下:

    1
    2
    3
    4
    5
    6
    7
    # Win32_Path              Mount_Point 
    C:DEVPACKMinGW            /mingw 
    C:DEVPACKMinGWmingw32    /mingw32 
    C:DEVPACKMinGWmingw64    /mingw64 
    C:DEVPACKMinGWopt        /opt 
    C:DEVPACKMinGWlocal32    /local32 
    C:DEVPACKMinGWlocal64     /local64 

    重新打开MSYS命令行工具(以后不特别说明,凡是以$开头的都是指msys-bat命令行MSYS,无$开头指windows命令行cmd),输入下面的命令以创建目录:

    1
    2
    3
    mkdir /opt/bin
    mkdir/local{32,64}/{bin,etc,include,lib,share,dst,src} 
    mkdir/local{32,64}/lib/pkgconfig 

    3 安装CMake
    在下面的地址下载cmake-2.8.10.2-win32-x86.zip,解压到/opt下面。

    http://www.cmake.org/cmake/resources/software.html

    解压后的目录结构如下:

    1
    2
    3
    4
    /opt/bin 
    /opt/doc 
    /opt/man 
    /opt/share 

    4 配置32位和64位编译环境
    打开MSYS命令行工具,运行下面的命令创建目录:

    1
    mkdir -p/mingw/local/{bin,docs,include,lib,share,src} 

    1)为了能分开编译32和64位的程序,为32位编译创建配置文件:/local32/etc/profile.local
    $ cat >/local32/etc/profile.local << "EOF"

    #==================Begin of /local32/etc/profile.local ====================

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    alias dir='ls -la --color=auto' 
    alias ls='ls --color=auto' 
       
    export PKG_CONFIG_PATH="/local32/lib/pkgconfig" 
    export CPPFLAGS="-I/local32/include" 
    export CFLAGS="-I/local32/include -mms-bitfields -mthreads -mtune=pentium3" 
    export CXXFLAGS="-I/local32/include -mms-bitfields -mthreads -mtune=pentium3" 
    export LDFLAGS="-L/local32/lib -lpthread -mthreads" 
    export PATH=".:/local32/bin:/mingw32/bin:/mingw/bin:/bin:/opt/bin:$PATH" 
    export PS1='[33[32m]u@h [33[33mw33[0m]$ ' 
       
    export SRC_DIR=/local32/src 
    export DST_DIR=/local32/dst 
    export MINGW_HOME=/mingw32 
    export PKG_CONFIG=$DST_DIR/pkgconfig/bin/pkg-config.exe 
       
    # Configure PATH and FLAGS. 
       
    APPLICATION_ARRAY=( 
    "LIBICONV_PREFIX:$DST_DIR/libiconv" 
    "ZLIB_PREFIX:$DST_DIR/zlib" 
    "BZIP2_PREFIX:$DST_DIR/bzip2" 
    "LIBTOOL_PREFIX:$DST_DIR/libtool" 
    "LIBXML2_PREFIX:$DST_DIR/libxml2" 
    "LIBPNG_PREFIX:$DST_DIR/libpng" 
    "LIBJPEG_PREFIX:$DST_DIR/libjpeg" 
    "LIBTIFF_PREFIX:$DST_DIR/libtiff" 
    "FREETYPE2_PREFIX:$DST_DIR/freetype2" 
    "LCMS2_PREFIX:$DST_DIR/lcms2" 
    "FFTW_PREFIX:$DST_DIR/fftw" 
    "BOTAN_PREFIX:$DST_DIR/botan" 
    "QT_PREFIX:$DST_DIR/qt" 
    "OPENCV_PREFIX:$DST_DIR/opencv" 
    "LIBUSBX_PREFIX:$DST_DIR/libusbx" 
    "LIBFFI_PREFIX:$DST_DIR/libffi" 
    "PKGCONFIG_PREFIX:$DST_DIR/pkg-config" 
    "GETTEXT_PREFIX:$DST_DIR/gettext" 
    "GLIB_PREFIX:$DST_DIR/glib" 
    "GMQ8_PREFIX:$DST_DIR/gm-q8" 
    "GMQ16_PREFIX:$DST_DIR/gm-q16" 
    "IMQ8_PREFIX:$DST_DIR/im-q8" 
    "IMQ16_PREFIX:$DST_DIR/im-q16" 
    "BOOST_PREFIX:$DST_DIR/boost" 
    "LIBUSBX_PREFIX:$DST_DIR/libusbx" 
    "GLIB_PREFIX:$DST_DIR/glib" 
    "YAFARAY_PREFIX:$DST_DIR/yafaray" 
    "SQLITE3_PREFIX:$DST_DIR/sqlite3" 
    "LIBTIFF_PREFIX:$DST_DIR/libtiff" 
       
    for app in "${APPLICATION_ARRAY[@]}" ; do 
       
        KEY=${app%%:*} 
        VALUE=${app##*:} 
        export "$KEY"="$VALUE" 
           
        export PATH="$VALUE/bin:$PATH" 
        export LDFLAGS="-L$VALUE/lib $LDFLAGS" 
        export CFLAGS="-I$VALUE/include $CFLAGS" 
        export CPPFLAGS="-I$VALUE/include $CPPFLAGS" 
        export CXXFLAGS="-I$VALUE/include $CXXFLAGS" 
        export PKG_CONFIG_PATH="$VALUE/lib/pkgconfig:$PKG_CONFIG_PATH" 
       
    done 
       
    export LIBFFI_CFLAGS="-I $DST_DIR/libffi/lib/libffi-3.0.11/include" 
    export LIBFFI_LIBS="-L$DST_DIR/libffi/lib" 

    #==================End of /local32/etc/profile.local =====================
    EOF

    2)为64位编译创建配置文件:/local64/etc/profile.local

    $ cat >/local64/etc/profile.local << "EOF"

    #==================Begin of /local64/etc/profile.local ====================

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    alias dir='ls -la --color=auto' 
    alias ls='ls --color=auto' 
       
    export PKG_CONFIG_PATH="/local64/lib/pkgconfig" 
    export CPPFLAGS="-I/local64/include" 
    export CFLAGS="-I/local64/include -mms-bitfields -mthreads" 
    export CXXFLAGS="-I/local64/include -mms-bitfields -mthreads" 
    export LDFLAGS="-L/local64/lib -lpthread" 
    export PATH=".:/local64/bin:/mingw64/bin:/mingw/bin:/bin:/opt/bin:$PATH" 
    export PS1='[33[32m]u@h [33[33mw33[0m]$ ' 
       
    export SRC_DIR=/local64/src 
    export DST_DIR=/local64/dst 
    export MINGW_HOME=/mingw64 
    export PKG_CONFIG=$DST_DIR/pkgconfig/bin/pkg-config.exe 
       
    # Configure PATH and FLAGS. 
       
    APPLICATION_ARRAY=( 
    "LIBICONV_PREFIX:$DST_DIR/libiconv" 
    "ZLIB_PREFIX:$DST_DIR/zlib" 
    "BZIP2_PREFIX:$DST_DIR/bzip2" 
    "LIBTOOL_PREFIX:$DST_DIR/libtool" 
    "LIBXML2_PREFIX:$DST_DIR/libxml2" 
    "LIBPNG_PREFIX:$DST_DIR/libpng" 
    "LIBJPEG_PREFIX:$DST_DIR/libjpeg" 
    "LIBTIFF_PREFIX:$DST_DIR/libtiff" 
    "FREETYPE2_PREFIX:$DST_DIR/freetype2" 
    "LCMS2_PREFIX:$DST_DIR/lcms2" 
    "FFTW_PREFIX:$DST_DIR/fftw" 
    "BOTAN_PREFIX:$DST_DIR/botan" 
    "QT_PREFIX:$DST_DIR/qt" 
    "OPENCV_PREFIX:$DST_DIR/opencv" 
    "LIBUSBX_PREFIX:$DST_DIR/libusbx" 
    "LIBFFI_PREFIX:$DST_DIR/libffi" 
    "PKGCONFIG_PREFIX:$DST_DIR/pkg-config" 
    "GETTEXT_PREFIX:$DST_DIR/gettext" 
    "GLIB_PREFIX:$DST_DIR/glib" 
    "GMQ8_PREFIX:$DST_DIR/gm-q8" 
    "GMQ16_PREFIX:$DST_DIR/gm-q16" 
    "IMQ8_PREFIX:$DST_DIR/im-q8" 
    "IMQ16_PREFIX:$DST_DIR/im-q16" 
    "BOOST_PREFIX:$DST_DIR/boost" 
    "LIBUSBX_PREFIX:$DST_DIR/libusbx" 
    "GLIB_PREFIX:$DST_DIR/glib" 
    "YAFARAY_PREFIX:$DST_DIR/yafaray" 
    "SQLITE3_PREFIX:$DST_DIR/sqlite3" 
    "LIBTIFF_PREFIX:$DST_DIR/libtiff" 
       
    for app in "${APPLICATION_ARRAY[@]}" ; do 
       
        KEY=${app%%:*} 
        VALUE=${app##*:} 
        export "$KEY"="$VALUE" 
           
        export PATH="$VALUE/bin:$PATH" 
        export LDFLAGS="-L$VALUE/lib $LDFLAGS" 
        export CFLAGS="-I$VALUE/include $CFLAGS" 
        export CPPFLAGS="-I$VALUE/include $CPPFLAGS" 
        export CXXFLAGS="-I$VALUE/include $CXXFLAGS" 
        export PKG_CONFIG_PATH="$VALUE/lib/pkgconfig:$PKG_CONFIG_PATH" 
       
    done 
       
    export LIBFFI_CFLAGS="-I $DST_DIR/libffi/lib/libffi-3.0.11/include" 
    export LIBFFI_LIBS="-L$DST_DIR/libffi/lib" 

    #==================End of /local64/etc/profile.local ======================
    EOF

    3)默认采用64位编译环境,因此更改脚本:
    $ cat >> /etc/profile << "EOF"

    1
    2
    3
    if [ -f/local64/etc/profile.local ]; then 
            source /local64/etc/profile.local 
    fi 

    EOF
    4)在MYSYS命令行中使用下面的语句可以在32/64位编译环境之间切换:

    1
    2
    source /local64/etc/profile.local 
    source /local32/etc/profile.local 

    5 编译安装x64库
    5.1 Pkg-config Lite
    pkg-config程序就是向用户向程序提供相应库的路径、版本号等信息的程序。譬如说我们运行以下命令pkg-config 查看gcc的CFLAGS参数:

    $pkg-config --libs --cflags opencv

    会显示如下信息:

    -I/usr/include/opencv -lcxcore -lcv -lhighgui-lcvaux

    这就是用gcc编译连接时CFLAGS的参数。因此当我们需要编译连接某个库时,我们只需把上面那行加入gcc 的参数里面即可。这也是configure的作用,它会检查你需要的包,产生相应的信息。

    下载:pkg-config-lite-0.27.1-1.tar.gz

    地址:http://sourceforge.net/projects/pkgconfiglite/files/0.27.1-1/

    解压到$SRC_DIR:/local64/src

    1
    2
    3
    4
    5
    6
    $ cd $SRC_DIR 
    $ tar -zxf pkg-config-lite-0.27.1-1.tar.gz 
    $ cd pkg-config-lite-0.27.1-1 
    $ sh configure --prefix=$PKGCONFIG_PREFIX 
    $ make -j4             # 指定使用4CPU构建,仅仅加速编译过程,不影响最后结果 
    $ make install 

    按照上面的过程,很顺利我们编译好了64位版本的程序pkg-config。下面继续。

    5.2 编译zlib

    http://zlib.net

    下载:zlib-1.2.8.tar.gz 到$SRC_DIR

    1
    2
    3
    4
    5
    6
    7
    8
    $ source /local64/etc/profile.local 
    $ tar -zxf zlib-1.2.8.tar.gz 
    $ make -f win32/Makefile.gcc 
    $ export "INCLUDE_PATH=$ZLIB_PREFIX/include" 
    $ export "LIBRARY_PATH=$ZLIB_PREFIX/lib" 
    $ export "BINARY_PATH=$ZLIB_PREFIX/bin" 
    $ mkdir -p $ZLIB_PREFIX/bin && cp zlib1.dll $ZLIB_PREFIX/bin/ 
    $ make -f win32/Makefile.gcc install 

    5.3 编译libiconv
    这是个字符编码转换库和工具。比如GBK->UTF-8。
    下载libiconv-1.14.tar.gz到$SRC_DIR:
    地址:

    http://ftp.gnu.org/pub/gnu/libiconv/

    运行下面的命令,解压源码包,编译和安装:

    1
    2
    3
    4
    5
    $ tar -zxf libiconv-1.14.tar.gz 
    $ cd $SRC_DIR/libiconv-1.14/ 
    $ sh configure –-prefix=$LIBICONV_PREFIX 
    $ make -j4 
    $ make install 

    同样的办法可以编译win32版本的libiconv:

    1
    2
    3
    4
    5
    6
    $ source /local32/etc/profile.local 
    $ tar -zxf libiconv-1.14.tar.gz 
    $ cd $SRC_DIR/libiconv-1.14/ 
    $ sh configure –-prefix=$LIBICONV_PREFIX 
    $ make -j4 
    $ make install 

    5.4 编译LibTIFF
    下载:tiff-4.0.3.tar.gz

    地址:ftp://ftp.remotesensing.org/pub/libtiff/

    解压到:$SRC_DIR (32位是/local32/src, 64位是/local64/src)

    1
    2
    3
    4
    5
    $ tar -zxf tiff-4.0.3.tar.gz 
    $ cd $SRC_DIR/tiff-4.0.3/ 
    $ sh configure –-prefix=$LIBTIFF_PREFIX 
    $ make -j4 
    $ make install 

    5.5 编译Sqlite3
    下载:sqlite-autoconf-3071602.tar.gz

    地址:http://sqlite.org/2013/sqlite-autoconf-3071602.tar.gz

    运行:

    1
    2
    3
    4
    $ tar -zxf sqlite-autoconf-3071602.tar.gz 
    $ sh configure --prefix=$SQLITE3_PREFIX 
    $ make -j4 
    $ make install 

    总结一下,编译和安装 YourLib 步骤是:

    3-1)下载库源码包 YourLib.tar.gz 到 $SRC_DIR

    3-2)在/local??/etc/profile.local文件中添加我们要编译的库配置,例如:

    1
    2
    3
    ...... 
    "SQLITE3_PREFIX:$DST_DIR/sqlite3" 
    "YourLib_PREFIX:$DST_DIR/yourlib" 

    3-3)运行解压和编译命令:

    1
    2
    3
    4
    $ tar -zxf YourLib.tar.gz 
    $ sh configure --prefix=$YourLib_PREFIX 
    $ make -j4 
    $ make install 

    然后就可以把YourLib.dll拷贝到Win32/64系统中使用了。仿照此方法,可以编译其他库。
    6 使用Libiconv的64位版本
    使用MSVS2010创建win32控制台空项目,添加下面的文件main.c。然后更改项目平台为:x64。

    项目属性里面,链接器->高级里面选择:MachineX64 (/MACHINE:X64)。常规->字符集->未设置。经过这样的配置,就可以编译32 / 64位windows程序了。main.c的全部代码如下,可以很好地编译出32位和64位版本:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    /* main.c
     *   using Libiconv 64bits
     * cheungmine
     * 2013-5-13
     */ 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <memory.h> 
       
    #include <windows.h> 
       
    /* x64 */ 
    #include "C:/DEVPACK/MinGW/local64/dst/libiconv/include/iconv.h" 
       
    /* x86-32 */ 
    #include "C:/DEVPACK/MinGW/local32/dst/libiconv/include/iconv.h" 
       
    typedef iconv_t (*def_libiconv_open) (const char* tocode, const char* fromcode); 
    typedef size_t (*def_libiconv) (iconv_t cd,  char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); 
    typedef int (*def_libiconv_close) (iconv_t cd); 
       
    int main (int argc, char **argv) 
      size_t ret; 
      iconv_t cd, cd2; 
      char *inbuf, *in, *outbuf, *out; 
      size_t inlen, outlen; 
       
      HMODULE hDll; 
      def_libiconv_open __iconv_open; 
      def_libiconv_close __iconv_close; 
      def_libiconv __iconv; 
       
      in = (char*) malloc(100); 
      strcpy(in, "Hello, 中国!"); 
      inbuf = in; 
      inlen = strlen(in) + 1; 
       
      out = (char*) malloc(100); 
      *out = 0; 
      outbuf = out; 
      outlen = 100; 
       
      if (sizeof(void*) == 8) { 
        printf("build for x64 Windows. "); 
        hDll = LoadLibrary("C:/DEVPACK/MinGW/local64/dst/libiconv/bin/libiconv-2.dll"); 
      } else { 
        printf("build for 32-bits Windows. "); 
        hDll = LoadLibrary("C:/DEVPACK/MinGW/local32/dst/libiconv/bin/libiconv-2.dll"); 
      
       
      if (!hDll) { 
        printf("DLL not found. "); 
        exit(0); 
      
       
      __iconv_open = (def_libiconv_open) GetProcAddress(hDll, "libiconv_open"); 
      if (!__iconv_open) { 
        printf("libiconv_open not found. "); 
        exit(0); 
      
       
      __iconv = (def_libiconv) GetProcAddress(hDll, "libiconv"); 
      if (!__iconv_open) { 
        printf("libiconv not found. "); 
        exit(0); 
      
       
      __iconv_close = (def_libiconv_close) GetProcAddress(hDll, "libiconv_close"); 
      if (!__iconv_open) { 
        printf("libiconv_close not found. "); 
        exit(0); 
      
       
      cd = __iconv_open("UTF-8", "GBK"); 
      cd2 = __iconv_open("GBK", "UTF-8"); 
       
      ret = __iconv(cd, (char**)&in, &inlen, (char**)&out, &outlen); 
      printf("GBK(%s) => UTF-8(%s) ", inbuf, outbuf); 
       
      /* now in is utf-8 string */ 
      in = outbuf; 
      inlen = strlen(in)+1; 
       
      /* now out is empty */ 
      *inbuf = 0; 
      out = inbuf; 
      outlen = 100; 
       
      ret = __iconv(cd2, (char**)&in, &inlen, (char**)&out, &outlen); 
      printf("UTF-8(%s) => GBK(%s) ", outbuf, inbuf); 
       
      __iconv_close(cd); 
      __iconv_close(cd2); 
         
      free(inbuf); 
      free(outbuf); 
         
      FreeLibrary(hDll); 
      return 0; 
    }

    7 总结
    MinGW作为组织开发、持续集成大型Windows项目,充分利用开源软件,的一款极为优秀的交叉编译环境,提供了我们在不同的平台上编译 Windows程序的能力。举例子来说:

    1)x86_64-w64-mingw32-gcc-4.8.0-cygwin_rubenvb.tar.xz

    这个包在Cygwin环境下使用MinGW编译出原生的64位Windows二进制APP(静态库,动态库和可执行程序)。

    2)x86_64-w64-mingw32-gcc-4.8.0-linux64_rubenvb.tar.xz

    这个包在Linux amd64环境下使用MinGW编译出原生的64位Windows二进制APP。

    3)i686-w64-mingw32-gcc-4.8.0-win64_rubenvb.7z

    这个包在Window x64环境下使用MinGW编译出原生的32位Windows二进制APP。

  • 相关阅读:
    Android Scroller简单用法
    android 使用Scroller实现缓慢移动
    Android中View绘制优化之三---- 优化View
    Android中View绘制优化二一---- 使用<include />标签复用布局文件
    世纪互联云和华为共同打造的数据中心是一个很好的一步标志!
    isset,empty,is_null小知识
    迭代法塔的问题,如果中国
    hdu4288 Coder(段树+分离)
    关于淘汰85%查看面试官百度开发者面对的问题
    生命游戏(两),有一种东西叫CCScrollView
  • 原文地址:https://www.cnblogs.com/weinyzhou/p/4983338.html
Copyright © 2011-2022 走看看