PDA

View Full Version : Hướng Dẫn Cross Compile Qt FrameWork Trên Ubuntu



AlexF
18-03-2011, 11:39 AM
Xin chào các bạn, hôm nay Alexf sẽ viết 1 bài hướng dẫn khá thú vị về Qt và gcc

Phần lớn các Project opensource C/C++ gcc đều được develop trên linux,và phần lớn trong số chúng đều là những sản phẩm đa nền tảng. Để tạo 1 ứng dụng trên 1 nền tảng bất kỳ ( giả sử như windows, hay mac chẳng hạn), thay vì phải bê source code sang nền tảng đó và kiếm 1 phiên bản gcc trên đó để biên dịch, bạn hoàn toàn có thể Cross Compile chúng ngay trên Linux. Hôm nay tôi sẽ hướng dẫn các bạn Cross Compile 1 ứng dụng hoạt động trên Windows nhưng lại được biên dịch trên Linux


1) Chuẩn Bị GCC Cross Compile

Có rất nhiều phương pháp Cross Compile và cũng rất nhiều nền tảng có thể Cross, thậm chí tôi có thể biên dịch 1 ứng cho 1 con chíp Arm sử dụng hệ điều hành Windows trên nền tảng Linux X86, nhưng về bản chất thì chúng có cách thực hiện giống nhau. Điều gốc rễ đầu tiên là Gcc, bạn phải chọn phiên bản gcc thích hợp nhé( cái này có tên là toolchain nhé --> đọc tại đây để hiểu chi tiết (http://forums.congdongcviet.com/showpost.php?p=205236&postcount=2))

vào ubuntu gõ lệnh
apt-get install gcc-mingw32 để Download gcc Cross Compile cho Windows, nó sẽ được lưu vào đường dẫn

/usr/i586-mingw32msvc/bin

2) Cài đặt Qt For Linux http://qt.nokia.com/downloads/sdk-linux-x11-32bit-cpp
cực kỳ chú ý là fix đường dẫn mặc định của Qt lúc cài là /opt/qtsdk-2010.05

3) Lấy bộ thư viện của Qt đã được cài đặt lên windows http://qt.nokia.com/downloads/sdk-windows-cpp


sau đó tạo thư mục bằng lệnh: mkdir /opt/qt-sonnh-windows/
-----copy toàn bộ thư mục C:\Qt\2010.05\qt ( thư mục này nằm trên windows nhé ) vào thư mục /opt/qt-sonnh-windows/ vừa mới tạo ra ( trừ thư mục bin nhé )


4) Copy win32-x-g++ ( download phía bên dưới ) vào /opt/qtsdk-2010.05/qt/mkspecs

5) sửa file /opt/qtsdk-2010.05/qt/mkspecs/win32-x-g++/qmake.conf thành nội dung như sau



#

# qmake configuration for win32-g++

#

# Written for MinGW

#



MAKEFILE_GENERATOR = MINGW

TEMPLATE = app

CONFIG += qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header

QT += core gui

DEFINES += UNICODE QT_LARGEFILE_SUPPORT

QMAKE_COMPILER_DEFINES += __GNUC__ WIN32



QMAKE_EXT_OBJ = .o

QMAKE_EXT_RES = _res.o



QMAKE_CC = gcc

QMAKE_LEX = flex

QMAKE_LEXFLAGS =

QMAKE_YACC = byacc

QMAKE_YACCFLAGS = -d

QMAKE_CFLAGS =

QMAKE_CFLAGS_DEPS = -M

QMAKE_CFLAGS_WARN_ON = -Wall

QMAKE_CFLAGS_WARN_OFF = -w

QMAKE_CFLAGS_RELEASE = -O2

QMAKE_CFLAGS_DEBUG = -g

QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses



QMAKE_CXX = /usr/bin/i586-mingw32msvc-g++

QMAKE_CXXFLAGS = $$QMAKE_CFLAGS

QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS

QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON

QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE

QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG

QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC

QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD

QMAKE_CXXFLAGS_RTTI_ON = -frtti

QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti

QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads

QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions



QMAKE_INCDIR = /usr/win32/include

QMAKE_INCDIR_QT = /opt/qt-sonnh-windows/include

QMAKE_LIBDIR_QT = /opt/qt-sonnh-windows/lib



QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src

QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<

QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src

QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<



QMAKE_LINK = /usr/bin/i586-mingw32msvc-g++

QMAKE_LINK_C = gcc

QMAKE_LFLAGS = -mthreads -static-libgcc -static -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows



QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl

QMAKE_LFLAGS_EXCEPTIONS_OFF =

QMAKE_LFLAGS_RELEASE = -Wl,-s

QMAKE_LFLAGS_DEBUG =

QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console

QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows

QMAKE_LFLAGS_DLL = -shared

QMAKE_LINK_OBJECT_MAX = 10

QMAKE_LINK_OBJECT_SCRIPT= object_script





QMAKE_LIBS =

QMAKE_LIBS_CORE = -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32

QMAKE_LIBS_GUI = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lws2_32 -lole32 -luuid -luser32 -ladvapi32

QMAKE_LIBS_NETWORK = -lws2_32

QMAKE_LIBS_OPENGL = -lopengl32 -lglu32 -lgdi32 -luser32

QMAKE_LIBS_COMPAT = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32

QMAKE_LIBS_QT_ENTRY = -lmingw32 -lqtmain



!isEmpty(QMAKE_SH) {

MINGW_IN_SHELL = 1

QMAKE_DIR_SEP = /

QMAKE_COPY = cp

QMAKE_COPY_DIR = xcopy /s /q /y /i

QMAKE_MOVE = mv

QMAKE_DEL_FILE = rm

QMAKE_MKDIR = mkdir

QMAKE_DEL_DIR = rmdir

QMAKE_CHK_DIR_EXISTS = test -d

} else {

QMAKE_COPY = copy /y

QMAKE_COPY_DIR = xcopy /s /q /y /i

QMAKE_MOVE = move

QMAKE_DEL_FILE = del

QMAKE_MKDIR = mkdir

QMAKE_DEL_DIR = rmdir

QMAKE_CHK_DIR_EXISTS = if not exist

}



QMAKE_DIR_SEP = /

QMAKE_COPY = cp

QMAKE_COPY_DIR = cp -r

QMAKE_MOVE = mv

QMAKE_DEL_FILE = rm -f

QMAKE_MKDIR = mkdir -p

QMAKE_DEL_DIR = rm -rf



QMAKE_MOC = $$[QT_INSTALL_BINS]/moc

QMAKE_UIC = $$[QT_INSTALL_BINS]/uic

QMAKE_IDC = $$[QT_INSTALL_BINS]/idc



QMAKE_IDL = midl

QMAKE_LIB = ar -ru

QMAKE_RC = /usr/bin/i586-mingw32msvc-windres

QMAKE_ZIP = zip -r -9



QMAKE_STRIP = /usr/bin/i586-mingw32msvc-strip



QMAKE_STRIPFLAGS_LIB += --strip-unneeded

load(qt_config)



6) điền lại cho đúng các biến môi trường trong file qmake.conf với hệ thống của bạn ví dụ như QMAKE_CXX, QMAKE_LINK, QMAKE_INCDIR, QMAKE_INCDIR_QT, QMAKE_LIBDIR_QT




7) để biên dịch ta dùng lệnh:
đặt Qmake thành biến môi trường: gõ gedit /etc/profile
thêm vào cuối dòng sau: export PATH=/opt/qtsdk-2010.05/qt/bin:$PATH
khởi động lại và sau đó sử dụng bằng cách gõ


qmake -spec win32-x-g++

VD tôi có 1 Source code đơn giản tạo cửa sổ như đính kèm bên dứoi là sonnh


đầu tiên, cd đến thư mục cha của thư mục sonnh

gõ qmake -spec win32-x-g++ sonnh

tiếp theo gõ lệnh make
bạn sẽ có kết quả như trên hình

http://cB9.upanh.com/20.532.27432418.HjL0/ubuntu10.png


Và giờ bạn có thể đem file sonnh.exe đem đi chạy trên máy windows :D

http://cB6.upanh.com/20.532.27432515.Xoq0/programmanager20110327235018.png
Lưu ý: đối với các Developer C++ Opensource thì môi trường linux là trong sáng hơn so với môi trường Windows, nên phần lớn các source code Opensource chỉ hỗ trợ người lập trình coding trên Linux, bạn không thể hoặc rất khó có thể configure, locate, build libs trên Windows :)

nếu bị lỗi khi build, bạn có thể download thư mục lib của tôi http://www.mediafire.com/?xxvgq24u2tjuu84
và thế vào thư mục /opt/qt-sonnh-windows/lib của bạn

Joker
28-03-2011, 03:29 PM
không hiểu sao e làm đúng hướng dẫn nó lại bị 1 đống bug :-(

a coi trong file đính kèm giúp e với :(|

AlexF
28-03-2011, 03:31 PM
hình như em gõ là qmake -spec win32-g++
em gõ lại là qmake -spec win32-x-g++

sau đó gõ make nhé