zoukankan      html  css  js  c++  java
  • glib windows下编译

    记录的比较粗糙,但是绝对可行的 一些小的瑕疵以后再解决吧 (android版本的过几天再贴,移植到android已经通过)

    msys+mingw包下载:
    http://sourceforge.net/projects/tdm-gcc/?source=dlp
    http://sourceforge.net/projects/mingw/?source=dlp
    http://sourceforge.net/projects/mingw/?source=dlp

    安装方式:
    参考:
    http://wiki.videolan.org/Win32CompileMSYSNew
    或者
    http://blog.chinaunix.net/uid-26807463-id-3147631.html

    glib依赖包下载(google):
    zlib-1.2.8.tar.gz
    libffi-3.0.12.tar.gz
    libiconv-1.14.tar.gz
    gettext-0.18.2.tar.gz
    glib-2.34.3.tar.xz
    ,然后全部解压到C:Msys1.0homeAdministrator下,进入C:Msys1.0下 启动msys.bat 然后输入 cd home/Administrator/ (假设为Administrator用户)

    编译zlib
    cd zlib-1.2.8
    make -f win32/Makefile.gcc
    ,然后 手动安装
    cp -iv zlib1.dll /mingw/bin
    cp -iv zconf.h zlib.h /mingw/include
    cp -iv libz.a /mingw/lib
    cp -iv libz.dll.a /mingw/lib/libz.dll.a

    编译libffi-3.0.12
    cd libffi-3.0.12
    ./configure --prefix=c:/MinGW && make && make install

    编译libiconv-1.14
    cd libiconv-1.14 && ./configure --prefix=c:/MinGW --without-libiconv-prefix --without-libintl-prefix --enable-relocatable && make && make install
    cd ../

    可能会出现下面的错误,这个是make install的时候出现的,和relocatable选项有关,可能是libiconv-1.14的一个bug,但是dll已经生成且已经安装到指定目录(头文件iconv.h得自己手动拷贝到C:MinGWinclude ^^),所以可以暂时忽略,如果要解决的话,可以参考一下链接:
    http://git.yoctoproject.org/cgit.cgi/poky/plain/meta/recipes-support/libiconv/libiconv-1.14/add-relocatable-module.patch
    http://savannah.gnu.org/users/mail6543210
    https://lists.gnu.org/archive/html/bug-gnu-libiconv/2013-02/msg00004.html
    http://lists.linuxtogo.org/pipermail/openembedded-core/2012-January/015887.html

    ==================error============================
    libtool: link: gcc -g -O2 iconv.o iconv.res -o .libs/iconv.exe  ../srclib/libicr
    t.a c:/MinGW/lib/libiconv.dll.a -Lc:/MinGW/lib
    ../srclib/libicrt.a(progreloc.o): In function `prepare_relocate':
    C:Msys1.0homeAdministratorlibiconv-1.14srclib/progreloc.c:297: undefined r
    eference to `compute_curr_prefix'
    C:Msys1.0homeAdministratorlibiconv-1.14srclib/progreloc.c:302: undefined r
    eference to `set_relocation_prefix'
    collect2.exe: error: ld returned 1 exit status
    make[1]: *** [install] Error 1
    make[1]: Leaving directory `/home/Administrator/libiconv-1.14/src'
    make: *** [install] Error 2
    ====================================================
    

    编译gettext-0.18.2/gettext-runtime,为了获得 libintl-8.dll/libaprintf-0.dll/ngettext.exe
    cd gettext-0.18.2/gettext-runtime
    ./configure --prefix=c:/MinGW --disable-java --enable-relocatable --without-libintl-prefix --with-libiconv-prefix=c:/MinGW && make && make install
    cd ../

    编译gettext-0.18.2
    cd gettext-tools
    ./configure --prefix=c:/MinGW --disable-java --enable-relocatable --with-libintl-prefix=c:/MinGW --with-libiconv-prefix=c:/MinGW --disable-shared --with-libexpat-prefix=c:/MinGW --disable-openmp --enable-threads=win32 && make
    可能会碰到错误, 没关系我们需要的exe已经好了, 直接cp src/*.exe /mingw/bin

    编译glib-2.34.3
    由于pkg-config在mingw里面默认没有装,而pkg-config又依赖glib库,这样就形成了循环依赖,我采用下面办法解决这个问题
    export LIBFFI_CFLAGS='-I /mingw/lib/libffi-3.0.12/include'
    export LIBFFI_LIBS=-lffi
    ./configure CFLAGS="-march=i486" --prefix=c:/mingw --with-threads=win32
    make -j2
    报错,如下

    Creating library file: .libs/libgio-2.0.dll.a
      CCLD     gio-querymodules.exe
      CCLD     glib-compile-resources.exe
      CCLD     gsettings.exe
      CCLD     gdbus.exe
      CCLD     gresource.exe
    make[4]: Leaving directory `/home/Administrator/glib-2.34.3/gio'
    Making all in tests
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    make[4]: Entering directory `/home/Administrator/glib-2.34.3/gio/tests'
      GEN      test_resources.c
      GEN      test_resources2.c
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
      GEN      test_resources2.h
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    make  all-recursive
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    XMLLINT not set and xmllint not found in path; skipping xml preprocessing.
    make[5]: Entering directory `/home/Administrator/glib-2.34.3/gio/tests'
    Making all in gdbus-object-manager-example
    make[6]: Entering directory `/home/Administrator/glib-2.34.3/gio/tests/gdbus-obj
    ect-manager-example'
      GEN      gdbus-example-objectmanager-generated.h
      GEN      gdbus-example-objectmanager-generated.c
    /usr/bin/env: python2.5: No such file or directory
    make[6]: *** [gdbus-example-objectmanager-generated.c] Error 127
    make[6]: *** Waiting for unfinished jobs....
    /usr/bin/env: python2.5: No such file or directory
    make[6]: *** [gdbus-example-objectmanager-generated.h] Error 127
    make[6]: Leaving directory `/home/Administrator/glib-2.34.3/gio/tests/gdbus-obje
    ct-manager-example'
    make[5]: *** [all-recursive] Error 1
    make[5]: Leaving directory `/home/Administrator/glib-2.34.3/gio/tests'
    make[4]: *** [all] Error 2
    make[4]: Leaving directory `/home/Administrator/glib-2.34.3/gio/tests'
    make[3]: *** [all-recursive] Error 1
    make[3]: Leaving directory `/home/Administrator/glib-2.34.3/gio'
    make[2]: *** [all] Error 2
    make[2]: Leaving directory `/home/Administrator/glib-2.34.3/gio'
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/home/Administrator/glib-2.34.3'
    make: *** [all] Error 2
    

    其实库已经编译完成 这是编译test模块的时候出错,估计是说缺少python工具,忽略该错误 ^^
    make install完成安装
    继续报错,如下:

    make[3]: Entering directory `/home/Administrator/glib-2.34.3/gio/gdbus-2.0/codeg
    en'
    make[4]: Entering directory `/home/Administrator/glib-2.34.3/gio/gdbus-2.0/codeg
    en'
     /bin/mkdir -p 'c:/mingw/bin'
     /bin/install -c gdbus-codegen 'c:/mingw/bin'
     /bin/mkdir -p 'c:/mingw/lib/gdbus-2.0/codegen'
     /bin/install -c -m 644 __init__.py codegen.py codegen_main.py codegen_docbook.p
    y config.py dbustypes.py parser.py utils.py 'c:/mingw/lib/gdbus-2.0/codegen'
    /bin/sh: line 19: python2.5: command not found
    make[4]: *** [install-codegenPYTHON] Error 127
    make[4]: Leaving directory `/home/Administrator/glib-2.34.3/gio/gdbus-2.0/codege
    n'
    make[3]: *** [install-am] Error 2
    make[3]: Leaving directory `/home/Administrator/glib-2.34.3/gio/gdbus-2.0/codege
    n'
    make[2]: *** [install-recursive] Error 1
    make[2]: Leaving directory `/home/Administrator/glib-2.34.3/gio'
    make[1]: *** [install] Error 2
    make[1]: Leaving directory `/home/Administrator/glib-2.34.3/gio'
    make: *** [install-recursive] Error 1
    

    照样忽略即可。

    测试

        #include <stdio.h>
        #include <string.h>
        #include <glib.h>
    
        #define TEST0(function) G_STMT_START {
                                    if (!function())
                                        g_print("test "#function" failed!
    ");
                                }G_STMT_END
                                        
        int main(int agrc, char **argv)
        {
            g_print("Hello world!n");
            TEST0(thread_test);
            TEST0(main_loop_test);
            TEST0(io_channel_test);
            while(1);
        }
    
        gpointer thr_func(gpointer data)
        {
            g_print("test-thread running, say: %s
    ", data);
        }
    
        gboolean thread_test(void)
        {
            return NULL == g_thread_new("test-thread", thr_func, "Hello")
                        ? FALSE:TRUE;
        }
    
        typedef struct _TimeBlock TimeBlock;
        struct _TimeBlock {
            gpointer data;
            GMainLoop *loop;
        };
    
        gboolean time_func(gpointer data)
        {
            TimeBlock *tb = (TimeBlock *)data;
            g_print("in time func, say: %sn", tb->data);
            g_main_loop_quit(tb->loop);
            return FALSE;
        }
    
        gboolean main_loop_test(void)
        {
            GMainLoop *loop = g_main_loop_new(NULL, FALSE);
            TimeBlock tb = {"5s passe!", loop};
            g_timeout_add(5*1000, time_func, &tb);
            g_print("loop startn");
            g_main_loop_run(loop);
            g_print("loop endn");
            g_main_loop_unref(loop);
           
            return TRUE;
        }
    
        gboolean io_channel_test(void)
        {
            gboolean ret = FALSE;
            GError *err = NULL;
            gchar *tmp = g_strdup(g_get_prgname());
            *strchr(tmp, '.') = 0;
            gchar *filename = g_strdup_printf("%s%s", tmp, ".c");
            g_free(tmp);
            
            GIOChannel *fio = g_io_channel_new_file(filename, "r", &err);
            if (NULL != fio) {
                    gchar *buf; gsize buf_len;
                    GIOStatus fstatus = g_io_channel_read_to_end(fio, &buf, &buf_len, &err);
                    if (G_IO_STATUS_NORMAL == fstatus) {
                        g_print("read file:%s successed, file len:%d
    ", filename, buf_len);
                        g_free(buf);
                        g_io_channel_unref(fio);
                        ret = TRUE;
                    } else {
                        g_print("read file:%s failed, err:%s
    ", filename,
                                NULL == err? "UnKnow error!":err->message);
                        if (NULL != err)
                            g_error_free(err);
                    }
            } else {
                g_print("open file:%s failed, err:%sn", filename,
                                NULL == err? "UnKnow error!":err->message);
                if (NULL != err)
                    g_error_free(err);
            }
            
            g_free(filename);
           
            return ret;
        }
        //gcc glib-test.c -I /mingw/include/glib-2.0 -I /mingw/lib/glib-2.0/include -L /mingw/bin -lintl-8 -liconv-2 -lole32 -lglib-2.0 -o glib-test.exe
    

    参考文章

    http://mathslinux.org/?p=268#comment-1019
    http://www.mingw.org/wiki/Bootstrapping_GLIB_with_MinGW
    http://blog.sina.com.cn/s/blog_53825fe20100n9h8.html

    完!
    2013年7月

  • 相关阅读:
    Mysql 主从设置
    HTTP协议--请求与响应
    Memcahce(MC)系列(一)Memcache介绍、使用、存储、算法、优化
    Nginx配置性能优化
    PHP版本--HTTP session cookie原理及应用
    MYSQL 优化常用方法
    linux查询系统负载
    一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈
    数据库SQL SELECT查询的工作原理
    Unity使用UGUI进行VR游戏的界面开发
  • 原文地址:https://www.cnblogs.com/rongpmcu/p/7662210.html
Copyright © 2011-2022 走看看