歡迎您光臨本站 註冊首頁

編譯最新的gtk+3

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
工作關係,要求在GNU/Linux下安裝任何軟體都只能用源代碼編譯安裝
最新的gtk+3安裝到非系統標準目錄/opt/gtk2



1.
設置編譯環境變數

$ cat ~/develop/env/opt.gtk2.env
export PKG_CONFIG_PATH=/opt/gtk2/lib/pkgconfig
export LD_LIBRARY_PATH=/opt/gtk2/lib
export PATH=/opt/gtk2/bin:$PATH
export MANPATH=/opt/gtk2/man:/opt/gtk2/share/man
export INFOPATH=/opt/gtk2/info:/opt/gtk2/share/info
$ . ~/develop/env/opt.gtk2.env

2.
下載最新的源代碼包
依賴關係和編譯順序如下所示:

==> glib-2.25.8
dbus-1.3.0
gettext-0.18
==> atk-1.30.0
glib-2.25.8
==> cairo-1.8.10
pixman-0.18.2
freetype-2.3.12
libpng-1.2.43
fontconfig-2.8.0
==> pango-1.28.0
glib-2.25.8
cairo-1.8.10
==> gtk+-2.90.2
glib-2.25.8
atk-1.30.0
cairo-1.8.10
pango-1.28.0

例如gtk+-2.90.2的編譯順序依次為glib-2.25.8, atk-1.30.0, cairo-1.8.10, pango-1.28.0, gtk+-2.90.2

編譯命令皆為
$ ./configure --prefix=/opt/gtk2
$ make
$ sudo make install

3.

編譯成果驗證:
$ pkg-config --cflags --libs gtk+-3.0
-pthread -I/opt/gtk2/include/gtk-3.0 -I/opt/gtk2/lib/gtk-3.0/include -I/opt/gtk2/include/atk-1.0 -I/opt/gtk2/include/cairo -I/opt/gtk2/include/pango-1.0 -I/opt/gtk2/include/glib-2.0 -I/opt/gtk2/lib/glib-2.0/include -I/opt/gtk2/include/pixman-1 -I/opt/gtk2/include/freetype2 -I/opt/gtk2/include -I/opt/gtk2/include/libpng12  -pthread -L/opt/gtk2/lib -lgtk-x11-3.0 -lgdk-x11-3.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-3.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 
$ ldd /opt/gtk2/bin/gtk3-demo
    linux-gate.so.1 =>  (0xb7f00000)
    libgdk_pixbuf-3.0.so.0 => /opt/gtk2/lib/libgdk_pixbuf-3.0.so.0 (0xb7ee7000)
    libgdk-x11-3.0.so.0 => /opt/gtk2/lib/libgdk-x11-3.0.so.0 (0xb7e4f000)
    libgtk-x11-3.0.so.0 => /opt/gtk2/lib/libgtk-x11-3.0.so.0 (0xb7af0000)
    libXext.so.6 => /usr/lib/libXext.so.6 (0xb7ace000)
    libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb7acb000)
    libXi.so.6 => /usr/lib/libXi.so.6 (0xb7ac3000)
    libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb7aba000)
    libpangocairo-1.0.so.0 => /opt/gtk2/lib/libpangocairo-1.0.so.0 (0xb7ab0000)
    libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0xb7aac000)
    libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb7aa9000)
    libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb7aa4000)
    libatk-1.0.so.0 => /opt/gtk2/lib/libatk-1.0.so.0 (0xb7a8a000)
    libcairo.so.2 => /opt/gtk2/lib/libcairo.so.2 (0xb7a1f000)
    libpixman-1.so.0 => /opt/gtk2/lib/libpixman-1.so.0 (0xb79c9000)
    libpng12.so.0 => /opt/gtk2/lib/libpng12.so.0 (0xb79a6000)
    libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb799d000)
    libX11.so.6 => /usr/lib/libX11.so.6 (0xb78ae000)
    libgio-2.0.so.0 => /opt/gtk2/lib/libgio-2.0.so.0 (0xb77cf000)
    libresolv.so.2 => /lib/i686/cmov/libresolv.so.2 (0xb77bb000)
    libselinux.so.1 => /lib/libselinux.so.1 (0xb77a1000)
    libpangoft2-1.0.so.0 => /opt/gtk2/lib/libpangoft2-1.0.so.0 (0xb7772000)
    libpango-1.0.so.0 => /opt/gtk2/lib/libpango-1.0.so.0 (0xb7732000)
    libfontconfig.so.1 => /opt/gtk2/lib/libfontconfig.so.1 (0xb7704000)
    libfreetype.so.6 => /opt/gtk2/lib/libfreetype.so.6 (0xb7690000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb767b000)
    libexpat.so.0 => /usr/lib/libexpat.so.0 (0xb7654000)
    libgobject-2.0.so.0 => /opt/gtk2/lib/libgobject-2.0.so.0 (0xb7618000)
    libgmodule-2.0.so.0 => /opt/gtk2/lib/libgmodule-2.0.so.0 (0xb7615000)
    libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7611000)
    libgthread-2.0.so.0 => /opt/gtk2/lib/libgthread-2.0.so.0 (0xb760d000)
    libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb75f3000)
    librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb75ea000)
    libglib-2.0.so.0 => /opt/gtk2/lib/libglib-2.0.so.0 (0xb7506000)
    libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb74e0000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7385000)
    libXau.so.6 => /usr/lib/libXau.so.6 (0xb7381000)
    /lib/ld-linux.so.2 (0xb7f01000)
    libxcb-xlib.so.0 => /usr/lib/libxcb-xlib.so.0 (0xb737f000)
    libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb7367000)
    libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb7362000)
$
都指向正確

4.

運行程序
$ . ~/develop/env/opt.gtk2.env
$ gtk3-demo

5.

編譯過程遇到的問題解決
--- glib-2.25.8
libtool: link: gcc -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -g -O2 -Wall -o .libs/gdbus-serialization gdbus_serialization-gdbus-serialization.o gdbus_serialization-gdbus-tests.o  ../../glib/.libs/libglib-2.0.so ../../gthread/.libs/libgthread-2.0.so ../../gobject/.libs/libgobject-2.0.so ../../gio/.libs/libgio-2.0.so /home/c-aries/source/glib/glib-2.25.8/gobject/.libs/libgobject-2.0.so /home/c-aries/source/glib/glib-2.25.8/gthread/.libs/libgthread-2.0.so -lpthread -lrt /home/c-aries/source/glib/glib-2.25.8/gmodule/.libs/libgmodule-2.0.so -ldl /home/c-aries/source/glib/glib-2.25.8/glib/.libs/libglib-2.0.so -lresolv -lz -lselinux -L/lib -ldbus-1 -Wl,-rpath -Wl,/home/c-aries/source/glib/glib-2.25.8/work/lib
gdbus_serialization-gdbus-serialization.o: In function `check_serialization':
/home/c-aries/source/glib/glib-2.25.8/gio/tests/gdbus-serialization.c:531: undefined reference to `dbus_message_demarshal'
gdbus_serialization-gdbus-serialization.o: In function `print_gv_dbus_message':
/home/c-aries/source/glib/glib-2.25.8/gio/tests/gdbus-serialization.c:278: undefined reference to `dbus_message_set_serial'
/home/c-aries/source/glib/glib-2.25.8/gio/tests/gdbus-serialization.c:290: undefined reference to `dbus_message_marshal'
collect2: ld returned 1 exit status
make[4]: *** [gdbus-serialization] 錯誤 1
make[4]: Leaving directory `/home/c-aries/source/glib/glib-2.25.8/gio/tests'
make[3]: *** [all-recursive] 錯誤 1
make[3]: Leaving directory `/home/c-aries/source/glib/glib-2.25.8/gio'
make[2]: *** [all] 錯誤 2
make[2]: Leaving directory `/home/c-aries/source/glib/glib-2.25.8/gio'
make[1]: *** [all-recursive] 錯誤 1
make[1]: Leaving directory `/home/c-aries/source/glib/glib-2.25.8'
make: *** [all] 錯誤 2

解決:
安裝dbus-1.3.0

--- dbus-1.3.0
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I.. -I.. -fPIC -DDBUS_COMPILATION -DDBUS_MACHINE_UUID_FILE=\"/home/c-aries/source/dbus/dbus-1.3.0/work/var/lib/dbus/machine-id\" -DDBUS_SYSTEM_CONFIG_FILE=\"/home/c-aries/source/dbus/dbus-1.3.0/work/etc/dbus-1/system.conf\" -DDBUS_SESSION_CONFIG_FILE=\"/home/c-aries/source/dbus/dbus-1.3.0/work/etc/dbus-1/session.conf\" -ffunction-sections -fdata-sections -g -O2 -Wall -Wchar-subscripts -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wcast-align -Wdeclaration-after-statement -fno-common -Wno-unused -Wno-sign-compare -Wno-pointer-sign -Wno-format -fno-strict-aliasing -MT dbus-sysdeps-unix.lo -MD -MP -MF .deps/dbus-sysdeps-unix.Tpo -c dbus-sysdeps-unix.c  -fPIC -DPIC -o .libs/dbus-sysdeps-unix.o
dbus-sysdeps-unix.c: 在函數 ‘_dbus_dup’ 中:
dbus-sysdeps-unix.c:3047: 錯誤:‘cloexec_done’ 未聲明 (在此函數內第一次使用)
dbus-sysdeps-unix.c:3047: 錯誤:(即使在一個函數內多次出現,每個未聲明的標識符在其
dbus-sysdeps-unix.c:3047: 錯誤:所在的函數內只報告一次。)
make[3]: *** [dbus-sysdeps-unix.lo] 錯誤 1
make[3]: Leaving directory `/home/c-aries/source/dbus/dbus-1.3.0/dbus'
make[2]: *** [all] 錯誤 2
make[2]: Leaving directory `/home/c-aries/source/dbus/dbus-1.3.0/dbus'
make[1]: *** [all-recursive] 錯誤 1
make[1]: Leaving directory `/home/c-aries/source/dbus/dbus-1.3.0'
make: *** [all] 錯誤 2

解決:
dbus/dbus-sysdeps-unix.c:3047
改成 #ifdef F_DUPFD_CLOEXEC
$ diff -urNwB dbus-1.3.0/dbus/dbus-sysdeps-unix.c dbus-1.3.0-fix/dbus/dbus-sysdeps-unix.c
--- dbus-1.3.0/dbus/dbus-sysdeps-unix.c    2009-07-16 22:04:55.000000000 +0800
+++ dbus-1.3.0-fix/dbus/dbus-sysdeps-unix.c    2010-06-10 14:01:55.000000000 +0800
@@ -3043,7 +3044,7 @@
     return -1;
   }
 
-#ifndef F_DUPFD_CLOEXEC
+#ifdef F_DUPFD_CLOEXEC
   if (!cloexec_done)
 #endif
     {
$

--- glib-2.25.8 msgfmt
/usr/bin/msgfmt -o test.mo ./de.po; \
    /bin/mkdir -p de/LC_MESSAGES; \
    cp -f test.mo de/LC_MESSAGES
./de.po:15: 關鍵字“msgctxt”未知
./de.po:15:8: parse error
/usr/bin/msgfmt: 發現 2 處致命錯誤
cp: 無法 stat “test.mo”: 沒有那個文件或目錄
make[4]: *** [test.mo] 錯誤 1
make[4]: Leaving directory `/home/c-aries/source/glib/glib-2.25.8/gio/tests'

解決:
安裝gettext-0.18
export PATH=/opt/gtk2/bin:$PATH
checking for gmsgfmt... /opt/gtk2/bin/msgfmt

gtk+


[火星人 ] 編譯最新的gtk+3已經有443次圍觀

http://coctec.com/docs/program/show-post-71577.html