Kompilowanie programów C++ Qt na windowsa pod linuxem

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

[HOWTO]Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: DDAroo »

Dwa dni walczyłem z plikami konfiguracyjnymi, nie znalazłem polskich źródeł na ten temat więc postanowiłem napisać wątek. Początkowo bazowałem na informacjach na anglojęzycznych stronach: http://silmor.de/29, oraz http://lists.trolltech.com/qt-interest/ ... 351-0.html. Problemy jednak zaczęły się, gdy chciałem skompilować biblioteki *.dll, pluginy, używać polecenia make clean oraz kompilować projekty złożone z kilku plików *.pro

Po kolei - aby móc kompilować projekty Qt pod linuksem na windowsa:
1) Zdobądź kompilator mingw. Binarka jest dostępna w narzędziu Synaptic i nazywa się mingw32. Po jej zainstalowaniu kompilator C++ można wywołać poleceniem: i586-mingw32msvc-g++

2) Potrzebne są biblioteki Qt skompilowane pod windowsa. Najprościej jest użyć maszyny z windowsem (np. na wirtualizatorze Virtualbox) na której zainstalować dostępną na stronie Qt instalację Qt SDK z kompilatorem mingw. Potem skopiować zawartość katalogu lib (m.in. pliki: libQtGui4.a, libQtCored4.a) do linuxa. Ja skopiowałem do katalogu: /home/daroo/win_depen/Win32-Qt-4.5.0/lib

3) Zmień nazwy skopiowanych bibliotek - pozbądź się cyfry 4 z ich nazw np. libQtGui4.a ==> libQtGui.a

4) Potrzebne są pliki nagłówkowe. Należy skopiować zawartość katalogów include oraz src. Ja kopiowałem odpowiednio do: /home/daroo/win_depen/Win32-Qt-4.5.0/include oraz /home/daroo/win_depen/Win32-Qt-4.5.0/src

5) Należy utworzyć nowe pliki konfiguracyjne dla programu qmake tzw. qmakespec. W katalogu ze specami dla qmake'a (/usr/share/qt4/mkspecs) tworzymy nowy katalog i nazywamy go np. win32-x-g++. W katalogu tworzymy dwa pliki - qmake.conf i qplatformdefs.h. Zawartość tych plików:

qmake.conf
Przy czym skorygowania w zależności od miejsca skopiowania zawartości bibliotek, plików nagłówkowych oraz nazw programów mogą wymagać wpisy:

QMAKE_INCDIR = /usr/i586-mingw32msvc/include
QMAKE_INCDIR_QT = /home/daroo/win_depen/Win32-Qt-4.5.0/include
QMAKE_LIBDIR_QT = /home/daroo/win_depen/Win32-Qt-4.5.0/lib
QMAKE_CXX = /usr/bin/i586-mingw32msvc-g++
QMAKE_LINK = /usr/bin/i586-mingw32msvc-g++
QMAKE_AR = /usr/bin/i586-mingw32msvc-ar -ru
QMAKE_RC = /usr/bin/i586-mingw32msvc-windres
QMAKE_STRIP = /usr/bin/i586-mingw32msvc-strip

Kod: Zaznacz cały

#
# qmake configuration for win32-x-g++
#
# Written for MinGW and linux
#

MAKEFILE_GENERATOR	= UNIX
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_CFLAGS		+= -pipe
QMAKE_CFLAGS_DEPS	+= -M
QMAKE_CFLAGS_WARN_ON	+= -Wall -W
QMAKE_CFLAGS_WARN_OFF	+= -w
QMAKE_CFLAGS_RELEASE	+= -O2
QMAKE_CFLAGS_DEBUG	+= -g
QMAKE_CFLAGS_SHLIB	+= -fPIC
QMAKE_CFLAGS_STATIC_LIB	+= -fPIC
QMAKE_CFLAGS_YACC	+= -Wno-unused -Wno-parentheses
QMAKE_CFLAGS_HIDESYMS   += -fvisibility=hidden
QMAKE_CFLAGS_PRECOMPILE += -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CFLAGS_USE_PRECOMPILE += -include ${QMAKE_PCH_OUTPUT_BASE}

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_SHLIB	+= $$QMAKE_CFLAGS_SHLIB
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/i586-mingw32msvc/include
QMAKE_INCDIR_QT		= /home/daroo/win_depen/Win32-Qt-4.5.0/include
QMAKE_LIBDIR_QT		= /home/daroo/win_depen/Win32-Qt-4.5.0/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_EXTENSION_SHLIB = dll

QMAKE_LINK		= /usr/bin/i586-mingw32msvc-g++
QMAKE_LFLAGS		+= -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_APP	+=
QMAKE_LFLAGS_CONSOLE	+= -Wl,-subsystem,console
QMAKE_LFLAGS_WINDOWS	+= -Wl,-subsystem,windows
QMAKE_LFLAGS_DLL        += -shared
QMAKE_LFLAGS_SHLIB	+= $$QMAKE_LFLAGS_DLL
QMAKE_LFLAGS_PLUGIN	+= $$QMAKE_LFLAGS_DLL
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

QMAKE_DIR_SEP		= /
QMAKE_COPY            = cp -f
QMAKE_COPY_FILE       = $(COPY)
QMAKE_COPY_DIR        = $(COPY) -r
QMAKE_MOVE            = mv -f
QMAKE_DEL_FILE        = rm -f
QMAKE_DEL_DIR         = rmdir
QMAKE_STRIP           = strip
QMAKE_CHK_DIR_EXISTS  = test -d
QMAKE_MKDIR           = mkdir -p

QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc
QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic
QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc

QMAKE_IDL		= midl
QMAKE_AR		= /usr/bin/i586-mingw32msvc-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

include(../common/unix.conf)

load(qt_config)
qplatformdefs.h

Kod: Zaznacz cały

/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain
** additional rights. These rights are described in the Nokia Qt LGPL
** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
** package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef QPLATFORMDEFS_H
#define QPLATFORMDEFS_H

// Get Qt defines/settings

#include "qglobal.h"

// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs

// 1) need to reset default environment if _BSD_SOURCE is defined
// 2) need to specify POSIX thread interfaces explicitly in glibc 2.0
// 3) it seems older glibc need this to include the X/Open stuff
#ifndef _GNU_SOURCE
#  define _GNU_SOURCE
#endif

#include <unistd.h>


// We are hot - unistd.h should have turned on the specific APIs we requested

#include <features.h>
#include <pthread.h>
#include <dirent.h>
#include <fcntl.h>
#include <grp.h>
#include <pwd.h>
#include <signal.h>
#include <dlfcn.h>

#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/ipc.h>
#include <sys/time.h>
#include <sys/shm.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <netinet/in.h>
#ifndef QT_NO_IPV6IFNAME
#include <net/if.h>
#endif

#ifdef QT_LARGEFILE_SUPPORT
#define QT_STATBUF              struct stat64
#define QT_STATBUF4TSTAT        struct stat64
#define QT_STAT                 ::stat64
#define QT_FSTAT                ::fstat64
#define QT_LSTAT                ::lstat64
#define QT_OPEN                 ::open64
#define QT_TRUNCATE             ::truncate64
#define QT_FTRUNCATE            ::ftruncate64
#define QT_LSEEK                ::lseek64
#else
#define QT_STATBUF              struct stat
#define QT_STATBUF4TSTAT        struct stat
#define QT_STAT                 ::stat
#define QT_FSTAT                ::fstat
#define QT_LSTAT                ::lstat
#define QT_OPEN                 ::open
#define QT_TRUNCATE             ::truncate
#define QT_FTRUNCATE            ::ftruncate
#define QT_LSEEK                ::lseek
#endif

#ifdef QT_LARGEFILE_SUPPORT
#define QT_FOPEN                ::fopen64
#define QT_FSEEK                ::fseeko64
#define QT_FTELL                ::ftello64
#define QT_FGETPOS              ::fgetpos64
#define QT_FSETPOS              ::fsetpos64
#define QT_FPOS_T               fpos64_t
#define QT_OFF_T                off64_t
#else
#define QT_FOPEN                ::fopen
#define QT_FSEEK                ::fseek
#define QT_FTELL                ::ftell
#define QT_FGETPOS              ::fgetpos
#define QT_FSETPOS              ::fsetpos
#define QT_FPOS_T               fpos_t
#define QT_OFF_T                long
#endif

#define QT_STAT_REG		S_IFREG
#define QT_STAT_DIR		S_IFDIR
#define QT_STAT_MASK		S_IFMT
#define QT_STAT_LNK		S_IFLNK
#define QT_SOCKET_CONNECT	::connect
#define QT_SOCKET_BIND		::bind
#define QT_FILENO		fileno
#define QT_CLOSE		::close
#define QT_READ			::read
#define QT_WRITE		::write
#define QT_ACCESS		::access
#define QT_GETCWD		::getcwd
#define QT_CHDIR		::chdir
#define QT_MKDIR		::mkdir
#define QT_RMDIR		::rmdir
#define QT_OPEN_LARGEFILE       O_LARGEFILE
#define QT_OPEN_RDONLY		O_RDONLY
#define QT_OPEN_WRONLY		O_WRONLY
#define QT_OPEN_RDWR		O_RDWR
#define QT_OPEN_CREAT		O_CREAT
#define QT_OPEN_TRUNC		O_TRUNC
#define QT_OPEN_APPEND		O_APPEND

#define QT_SIGNAL_RETTYPE	void
#define QT_SIGNAL_ARGS		int
#define QT_SIGNAL_IGNORE	SIG_IGN

#if defined(__GLIBC__) && (__GLIBC__ >= 2)
#define QT_SOCKLEN_T		socklen_t
#else
#define QT_SOCKLEN_T		int
#endif

#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)
#define QT_SNPRINTF		::snprintf
#define QT_VSNPRINTF		::vsnprintf
#endif


#endif // QPLATFORMDEFS_H
6) Polecenia do kompilowania projektu projekt.pro:
- qmake -spec win32-x-g++ projekt.pro
- make


Co działa przy takiej konfiguracji
- wieloplikowa kompilacja - wiele plików *.pro w podkatalogach projektu.
- polecenie make clean
- kompilacja wspódzielonych bibliotek *.dll, a także biblioteki linkowane statycznie do programów

Problemy
Wynikające z użytego generatora dla unixa (MAKEFILE_GENERATOR = UNIX):
- nie udało mi się wymusić, by programy miały rozszerzenie windowsowskie, trzeba ręcznie dopisywać .exe do nazw programów lub odpowiednio napisać plik *.pro dodając do niego np. :

Kod: Zaznacz cały

TARGET = progr
win32-x-g++:TARGET = progr.exe
- tworzone współdzielone bilbioteki są w stylu unixa, czyli trzy pliki z czego dwa to dowiązania symboliczne; właściwa biblioteka ma nazwę w stylu: libnazwa_bibl.dllwersja np. libMyLib.dll.1.0.0

inne:
- qmake nie aktualizuje zawartości wszystkich plików Makefile w przypadku kompilacji wielu plików *.pro, aktualizuje jedynie pierwszy plik; po kompilacji dla unixa qmake && make trzeba usunąć wszystkie pliki Makefile w podkatalogach projektu, a dopiero potem kompilować dla windowsa qmake -spec win32-x-g++ && make. Wynika to najprawdopodobniej z ograniczenia narzędzia qmake i mam nadzieję, że zostanie to poprawione.
- nie wiem czemu zmienna w pliku *.pro DLLDESTDIR nie daje żadnego skutku i w efekcie kod:

Kod: Zaznacz cały

DESTDIR = release
DLLDESTDIR = release/copy
daje taki sam skutek jak kod:

Kod: Zaznacz cały

DESTDIR = release
Nie wiem czy jest to bug w qmake czy tylko coś u mnie nie działa.
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: kabanek »

a nie prościej by było pod VirtualBox'em zainstalować Qt4 (chyba nawet już masz), przerzucić projekt, przekompilować i gotowe?
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: DDAroo »

Dość rzadko korzystam z windy, a takie przerzucanie plików jest niewygodne. Poza tym jest to punkt wyjściowy dla kompilacji także na inne systemy.
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: kabanek »

nie musisz każdej wersji, która kompilujesz uruchomią pod M$. Dopiero gotową wersję wypuszczaną wersję przekompilujesz sobie pod okonkami :)
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: el.pescado »

Dość rzadko korzystam z windy, a takie przerzucanie plików jest niewygodne. Poza tym jest to punkt wyjściowy dla kompilacji także na inne systemy.
A co z testowaniem?
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: kabanek »

el.pescado pisze:A co z testowaniem?
może będzie chciał testować pod wine, ale nie wiem czy to ma sens... Chyba lepszym rozwiązaniem jest normalne pisanie pod linuxem a jak będzie już wypuszczać, albo testować już bardziej rozwinięty, to wtedy można pokusić się przekompilowanie pod Window$em.

Szczerze to ja nie widzę sensu takiego komplikowania sobie sprawy, a windowsa można uruchomić na przykład pod VirtualBox'em, przesłać przez sieć i przekompilować :)
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: DDAroo »

heh zawsze pozostaje czysta satysfakcja, że da się pod linuxem i nie trzeba windy :)
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: kabanek »

też tak można :P

ale ja bym wolał jednak przetestować na łindołsie:D
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: el.pescado »

może będzie chciał testować pod wine, ale nie wiem czy to ma sens...
A jeżeli nie będzie działać to skąd wiadomo, czy to błąd w programie czy błąd w wine? I na odwrót, jeżeli będzie działać, to skąd wiadomo, że to akutar nie przez przypadek, gdyż w Windows akurat jest bug, którego nie ma w wine? ;)
Awatar użytkownika
urgo
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 09 wrz 2007, 20:37
Płeć: Mężczyzna
Wersja Ubuntu: 16.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: urgo »

Świetne Howto i wbrew temu co piszą koledzy, uważam że bardzo przydatne, przynajmniej dla mnie. Od dłuższego czasu właśnie czegoś takiego szukałem. Sprawdzę czy działa to u mnie i dam znać.

-----
i spróbowałem wg instrukcji powyżej, a oto efekt:

Kod: Zaznacz cały

urgo@ubuntu:~/Design $ sudo qmake -spec win32-x-g++ Design.pro 
urgo@ubuntu:~/Design $ sudo make
make -f Makefile.Release
make[1]: Wejście do katalogu `/home/urgo/Design'
make[1]: Nie ma nic do zrobienia w `first'.
make[1]: Opuszczenie katalogu `/home/urgo/Design'
i to chyba na tyle :sad:
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: DDAroo »

Wygląda jakbyś nie dodał żadnych plików do skompilowania w pliku *.pro w katalogu Design. Może nie dodałeś informacji o plikach do kompilacji? np.

Kod: Zaznacz cały

HEADERS += plik.h
SOURCES += plik.cpp
Jakbyś podał zawartość plików *.pro to bym mógł sprawdzić, gdzie jest błąd.
Awatar użytkownika
urgo
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 09 wrz 2007, 20:37
Płeć: Mężczyzna
Wersja Ubuntu: 16.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: urgo »

Nie powinno tu być raczej błędów, bo często kompiluję program pod linuksem, uruchamiam go i działa jak trzeba. Teraz chciałbym go jeszcze uruchamiać pod Windowsem, dlatego wypróbowałem Twoje Howto. A oto plik .pro

Kod: Zaznacz cały

TEMPLATE = app
QT = gui core
CONFIG += qt release warn_on console
DESTDIR = bin
OBJECTS_DIR = build
MOC_DIR = build
UI_DIR = build
FORMS = ui/mainwindow.ui ui/infoqt.ui ui/infosciezka.ui
HEADERS = src/mainwindowimpl.h src/infoqtimpl.h src/start.h src/infosciezkaimpl.h
SOURCES = src/mainwindowimpl.cpp \
 src/main.cpp \
 src/infoqtimpl.cpp \
 src/start.cpp \
 src/infosciezkaimpl.cpp
RESOURCES += grafika/Grafika.qrc
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: DDAroo »

Ten plik jest w porządku, pokaż jeszcze zawartość wygenerowanego przez qmake pliku Makefile.Release. Wydaje mi się, że to powinien być jakiś prosty błąd, bo zauważ że kompilator nie jest nawet wywoływany. Make twierdzi, że nie dałeś mu niczego do kompilowania.
Awatar użytkownika
urgo
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 09 wrz 2007, 20:37
Płeć: Mężczyzna
Wersja Ubuntu: 16.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: urgo »

Oto on:

Kod: Zaznacz cały

#############################################################################
# Makefile for building: bin/Design
# Generated by qmake (2.01a) (Qt 4.5.0) on: czw. wrz 24 22:15:57 2009
# Project:  Design.pro
# Template: app
#############################################################################

####### Compiler, tools and options

CC            = gcc
CXX           = /usr/bin/i586-mingw32msvc-g++
DEFINES       = -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS        = -pipe -O2 -Wall -W $(DEFINES)
CXXFLAGS      = -pipe -O2 -Wall -W $(DEFINES)
INCPATH       = -I/usr/share/qt4/mkspecs/win32-x-g++ -I. -I/home/urgo/Programy/Uzytkowe/Win32-Qt-4.5.0/include/QtCore -I/home/urgo/Programy/Uzytkowe/Win32-Qt-4.5.0/include/QtGui -I/home/urgo/Programy/Uzytkowe/Win32-Qt-4.5.0/include -Ibuild -Ibuild -I/usr/i586-mingw32msvc/include
LINK          = /usr/bin/i586-mingw32msvc-g++
LFLAGS        = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows -Wl,-s
LIBS          = $(SUBLIBS)  -L/home/urgo/Programy/Uzytkowe/Win32-Qt-4.5.0/lib -lQtGui -lQtCore
AR            = /usr/bin/i586-mingw32msvc-ar -ru
RANLIB        = 
QMAKE         = /usr/bin/qmake
TAR           = 
COMPRESS      = 
COPY          = cp -f
SED           = sed
COPY_FILE     = $(COPY)
COPY_DIR      = $(COPY) -r
INSTALL_FILE  = $(COPY_FILE)
INSTALL_DIR   = $(COPY_DIR)
INSTALL_PROGRAM = $(COPY_FILE)
DEL_FILE      = rm -f
SYMLINK       = ln -sf
DEL_DIR       = rmdir
MOVE          = mv -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p

####### Output directory

OBJECTS_DIR   = build/

####### Files

SOURCES       = src/mainwindowimpl.cpp \
		src/main.cpp \
		src/infoqtimpl.cpp \
		src/start.cpp \
		src/infosciezkaimpl.cpp build/moc_mainwindowimpl.cpp \
		build/moc_infoqtimpl.cpp \
		build/moc_infosciezkaimpl.cpp \
		release/qrc_Grafika.cpp
OBJECTS       = build/mainwindowimpl.o \
		build/main.o \
		build/infoqtimpl.o \
		build/start.o \
		build/infosciezkaimpl.o \
		build/moc_mainwindowimpl.o \
		build/moc_infoqtimpl.o \
		build/moc_infosciezkaimpl.o \
		build/qrc_Grafika.o
DIST          = /usr/share/qt4/mkspecs/common/unix.conf \
		/usr/share/qt4/mkspecs/qconfig.pri \
		/usr/share/qt4/mkspecs/features/qt_functions.prf \
		/usr/share/qt4/mkspecs/features/qt_config.prf \
		/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
		/usr/share/qt4/mkspecs/features/default_pre.prf \
		/usr/share/qt4/mkspecs/features/release.prf \
		/usr/share/qt4/mkspecs/features/debug_and_release.prf \
		/usr/share/qt4/mkspecs/features/default_post.prf \
		/usr/share/qt4/mkspecs/features/build_pass.prf \
		/usr/share/qt4/mkspecs/features/warn_on.prf \
		/usr/share/qt4/mkspecs/features/qt.prf \
		/usr/share/qt4/mkspecs/features/unix/thread.prf \
		/usr/share/qt4/mkspecs/features/moc.prf \
		/usr/share/qt4/mkspecs/features/resources.prf \
		/usr/share/qt4/mkspecs/features/uic.prf \
		/usr/share/qt4/mkspecs/features/yacc.prf \
		/usr/share/qt4/mkspecs/features/lex.prf \
		Design.pro
QMAKE_TARGET  = Design
DESTDIR       = bin/
TARGET        = bin/Design

first: all
####### Implicit rules

.SUFFIXES: .o .c .cpp .cc .cxx .C

.cpp.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cc.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cxx.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.C.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.c.o:
	$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<

####### Build rules

all: Makefile.Release $(TARGET)

$(TARGET): build/ui_mainwindow.h build/ui_infoqt.h build/ui_infosciezka.h $(OBJECTS)  
	@$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/ 
	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

qmake:  FORCE
	@$(QMAKE) -spec /usr/share/qt4/mkspecs/win32-x-g++ -unix -o Makefile.Release Design.pro

dist: 
	@$(CHK_DIR_EXISTS) build/Design1.0.0 || $(MKDIR) build/Design1.0.0 
	$(COPY_FILE) --parents $(SOURCES) $(DIST) build/Design1.0.0/ && $(COPY_FILE) --parents src/mainwindowimpl.h src/infoqtimpl.h src/start.h src/infosciezkaimpl.h build/Design1.0.0/ && $(COPY_FILE) --parents grafika/Grafika.qrc build/Design1.0.0/ && $(COPY_FILE) --parents src/mainwindowimpl.cpp src/main.cpp src/infoqtimpl.cpp src/start.cpp src/infosciezkaimpl.cpp build/Design1.0.0/ && $(COPY_FILE) --parents ui/mainwindow.ui ui/infoqt.ui ui/infosciezka.ui build/Design1.0.0/ && (cd `dirname build/Design1.0.0` && $(TAR) Design1.0.0.tar Design1.0.0 && $(COMPRESS) Design1.0.0.tar) && $(MOVE) `dirname build/Design1.0.0`/Design1.0.0.tar.gz . && $(DEL_FILE) -r build/Design1.0.0


clean:compiler_clean 
	-$(DEL_FILE) $(OBJECTS)
	-$(DEL_FILE) *~ core *.core


####### Sub-libraries

distclean: clean
	-$(DEL_FILE) $(TARGET) 
	-$(DEL_FILE) Makefile.Release


mocclean: compiler_moc_header_clean compiler_moc_source_clean

mocables: compiler_moc_header_make_all compiler_moc_source_make_all

compiler_moc_header_make_all: build/moc_mainwindowimpl.cpp build/moc_infoqtimpl.cpp build/moc_infosciezkaimpl.cpp
compiler_moc_header_clean:
	-$(DEL_FILE) build/moc_mainwindowimpl.cpp build/moc_infoqtimpl.cpp build/moc_infosciezkaimpl.cpp
build/moc_mainwindowimpl.cpp: build/ui_mainwindow.h \
		src/infoqtimpl.h \
		build/ui_infoqt.h \
		src/infosciezkaimpl.h \
		build/ui_infosciezka.h \
		src/start.h \
		src/mainwindowimpl.h
	/usr/bin/moc $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 src/mainwindowimpl.h -o build/moc_mainwindowimpl.cpp

build/moc_infoqtimpl.cpp: build/ui_infoqt.h \
		src/infoqtimpl.h
	/usr/bin/moc $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 src/infoqtimpl.h -o build/moc_infoqtimpl.cpp

build/moc_infosciezkaimpl.cpp: build/ui_infosciezka.h \
		src/infosciezkaimpl.h
	/usr/bin/moc $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 src/infosciezkaimpl.h -o build/moc_infosciezkaimpl.cpp

compiler_rcc_make_all: release/qrc_Grafika.cpp
compiler_rcc_clean:
	-$(DEL_FILE) release/qrc_Grafika.cpp
release/qrc_Grafika.cpp: grafika/Grafika.qrc \
		grafika/sto.png \
		grafika/fpelny.png \
		grafika/fodsuniety.png \
		grafika/Qt.png
	/usr/bin/rcc -name Grafika grafika/Grafika.qrc -o release/qrc_Grafika.cpp

compiler_image_collection_make_all: qmake_image_collection.cpp
compiler_image_collection_clean:
	-$(DEL_FILE) qmake_image_collection.cpp
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all: build/ui_mainwindow.h build/ui_infoqt.h build/ui_infosciezka.h
compiler_uic_clean:
	-$(DEL_FILE) build/ui_mainwindow.h build/ui_infoqt.h build/ui_infosciezka.h
build/ui_mainwindow.h: ui/mainwindow.ui
	/usr/bin/uic ui/mainwindow.ui -o build/ui_mainwindow.h

build/ui_infoqt.h: ui/infoqt.ui
	/usr/bin/uic ui/infoqt.ui -o build/ui_infoqt.h

build/ui_infosciezka.h: ui/infosciezka.ui
	/usr/bin/uic ui/infosciezka.ui -o build/ui_infosciezka.h

compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: compiler_moc_header_clean compiler_rcc_clean compiler_uic_clean 

####### Compile

build/mainwindowimpl.o: src/mainwindowimpl.cpp src/mainwindowimpl.h \
		build/ui_mainwindow.h \
		src/infoqtimpl.h \
		build/ui_infoqt.h \
		src/infosciezkaimpl.h \
		build/ui_infosciezka.h \
		src/start.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/mainwindowimpl.o src/mainwindowimpl.cpp

build/main.o: src/main.cpp src/mainwindowimpl.h \
		build/ui_mainwindow.h \
		src/infoqtimpl.h \
		build/ui_infoqt.h \
		src/infosciezkaimpl.h \
		build/ui_infosciezka.h \
		src/start.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/main.o src/main.cpp

build/infoqtimpl.o: src/infoqtimpl.cpp src/infoqtimpl.h \
		build/ui_infoqt.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/infoqtimpl.o src/infoqtimpl.cpp

build/start.o: src/start.cpp src/start.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/start.o src/start.cpp

build/infosciezkaimpl.o: src/infosciezkaimpl.cpp src/infosciezkaimpl.h \
		build/ui_infosciezka.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/infosciezkaimpl.o src/infosciezkaimpl.cpp

build/moc_mainwindowimpl.o: build/moc_mainwindowimpl.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/moc_mainwindowimpl.o build/moc_mainwindowimpl.cpp

build/moc_infoqtimpl.o: build/moc_infoqtimpl.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/moc_infoqtimpl.o build/moc_infoqtimpl.cpp

build/moc_infosciezkaimpl.o: build/moc_infosciezkaimpl.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/moc_infosciezkaimpl.o build/moc_infosciezkaimpl.cpp

build/qrc_Grafika.o: release/qrc_Grafika.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/qrc_Grafika.o release/qrc_Grafika.cpp

####### Install

install:   FORCE

uninstall:   FORCE

FORCE:
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: DDAroo »

Bez sensu, wszystko się zgadza :| W takim razie pewnie pliki tymczasowe *.o w katalogu build wmawiają programowi make, że nie ma co kompilować. Najlepszy sposób aby to sprawdzić to kasacja wszystkich plików tymczasowych w katalogu build.

Żebyś nie musiał za każdym razem usuwać plików *.o to w pliku *.pro możesz zdefiniować osobne katalogi dla każdej platformy na którą kompilujesz. Ja zawsze korzystam z czegoś podobnego do tego:

Kod: Zaznacz cały

# Compilation under windows
win32 { 
	CONFIG(debug, debug|release) { 
        DESTDIR = debug/win32
        RCC_DIR = build/debug/win32
        OBJECTS_DIR = build/debug/win32
        MOC_DIR = build/debug/win32
    }
    else { 
        DESTDIR = release/win32
        RCC_DIR = build/release/win32
        OBJECTS_DIR = build/release/win32
        MOC_DIR = build/release/win32
    }
}

# Compilation under unix
unix:!win32-x-g++ { 
    CONFIG(debug, debug|release) { 
        DESTDIR = debug/unix
        RCC_DIR = build/debug/unix
        OBJECTS_DIR = build/debug/unix
        MOC_DIR = build/debug/unix
    }
    else { 
        DESTDIR = release/unix
        RCC_DIR = build/release/unix
        OBJECTS_DIR = build/release/unix
        MOC_DIR = build/release/unix
    }
}

# Compilation under unix with precompiled Qt for windows
win32-x-g++ {
    CONFIG(debug, debug|release) { 
		DESTDIR = debug/win32x
        RCC_DIR = build/debug/win32x
        OBJECTS_DIR = build/debug/win32x
        MOC_DIR = build/debug/win32x
    }
    else { 
        DESTDIR = release/win32x
        RCC_DIR = build/release/win32x
        OBJECTS_DIR = build/release/win32x
        MOC_DIR = build/release/win32x
    }
}
Ten plik nazywam zwykle settings.pro i go dołączam do głównego pliku *.pro za pomocą:

Kod: Zaznacz cały

include(../settings.pro)
Musisz też pamiętać, aby usuwać pliki Makefile, Makefile.Release oraz Makefile.Debug przy każdej kompilacji na inny system operacyjny, gdy korzystasz z kompilacji wieloplikowej tj. gdy korzystasz z:

Kod: Zaznacz cały

TEMPLATE = subdirs
Z tego co widzę to z tego nie korzystasz, więc masz ten problem z głowy.
Awatar użytkownika
urgo
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 09 wrz 2007, 20:37
Płeć: Mężczyzna
Wersja Ubuntu: 16.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: urgo »

Faktycznie, skasowanie plików tymczasowych pomogło, tzn. coś się skompilowało :-D. Efekty sprawdzę jutro pod Windows i dam znać.

----

Wypróbowałem dzisiaj skompilowany program pod XP, i tu nasuwa mi się kolejne pytanie. Jak poradziłeś sobie z brakiem biblioteki QtCore4.dll ? Zainstalowałem qt pod Xp i nic, później wrzuciłem plik QtCore4.dll do c:/windows/system32 i też nie pomogło. Otrzymuje coś takiego:

Kod: Zaznacz cały

The procedure entry point _Z13qFlagLocationPKc could not be located in the dynamic link library QtCore4.dll
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: DDAroo »

Zacytowany przez Ciebie błąd oznacza, że skopiowałeś okrojoną wersję biblioteki. Pełne i skompilowane wersje bibliotek Qt możesz znaleźć w folderze bin w katalogu, w którym zainstalowałeś Qt SDK na windowsa. Przykładowo QtCore4.dll ma u mnie rozmiar 2,6MB; zaś QtGui4.dll ma 10,7MB. Potrzebna Ci jeszcze biblioteka mingwm10.dll, którą możesz znaleźć w folderze mingw\bin.

Wszystkie te dll-ki możesz wrzucić do katalogu z plikiem wykonywalnym *.exe programu. enjoy ;-)
Awatar użytkownika
urgo
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 09 wrz 2007, 20:37
Płeć: Mężczyzna
Wersja Ubuntu: 16.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: urgo »

Veni, Vidi, Vici. Wszystko działa jak powinno. :clap:
Masz rację odnośnie tych bibliotek. Jest kilka plików QtCore4.dll i QtGui4.dll. Wyszukałem tych, które mają największy rozmiar i mogę już odpalać mój program pod XP.
Dzięki za pomoc.
macer
Wytworny Kaczor
Wytworny Kaczor
Posty: 453
Rejestracja: 12 wrz 2009, 21:07
Wersja Ubuntu: inny OS

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: macer »

Świetne HOW-TO :)

Ale mam jedno pytanie...co to za QtCored i QtGuid?
Chyba nie są one wymagane do działania programu?
michal12345
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 119
Rejestracja: 13 cze 2007, 20:57
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Kompilowanie programów C++ Qt na windowsa pod linuxem

Post autor: michal12345 »

macer pisze:Ale mam jedno pytanie...co to za QtCored i QtGuid?
Chyba nie są one wymagane do działania programu?
To są biblioteki potrzebne do debugowania programu.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości