Seite 1 von 2

QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Mo Jul 09, 2012 9:58 pm
von nouseforname
Arbeite nun unter Ubuntu, dort arbeite ich mich gerade in QT ein. Die Überschrift sagt alles.

Hat jemand mal nen Tip für mich?
Flag: -m32 verwenden denke ich, aber noch weiss ich nicht wie.

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Mo Jul 09, 2012 11:05 pm
von nufan
Das ist eine relativ schwierige Frage, bei der du um das selber kompilieren der Qt-Bibliothek wohl nicht rumkommen wirst. Dabei musst du beim configure-Schritt "-arch i386" als Parameter angeben. Danach kannst du dein selbst erstelltes qmake für die Includes und Bibliotheken verwenden. Dann kannst du den "-m32"-Flag in der Projekt-Datei zu den Variablen "QMAKE_CFLAGS", "QMAKE_CXXFLAGS" und "QMAKE_LFLAGS" hinzufügen.
So KÖNNTE es gehen... ^^ Ich hab das selber noch nie versucht, werde es aber in den nächsten Tagen mal versuchen und ins Wiki packen.

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Di Jul 10, 2012 11:06 am
von Xin
nouseforname hat geschrieben:Arbeite nun unter Ubuntu, dort arbeite ich mich gerade in QT ein. Die Überschrift sagt alles.

Hat jemand mal nen Tip für mich?
Flag: -m32 verwenden denke ich, aber noch weiss ich nicht wie.
Ich habe mal ein GTK-Programm auf Linux für Windows kompiliert. Das ist zumindest nah dran am Problem. ;-)

Du brauchst die Libs für 32 bit, damit Du am Schluss linken kannst. Statt ins systemeigene, übliche Linkverzeichnis musst Du alle benötigten Libs in 32 Bit verfügbar haben und dem gcc mit -L dann dann das 32-Bit-Libs-Verzeichnis mitgeben.

Aber das ganze funktioniert ohne qmake - ich weiß nicht, was man tun muss, um qmake zur Cross-Compilation zu überreden oder ob man den Job von qmake selbst abbilden kann.

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Di Jul 10, 2012 4:32 pm
von nouseforname
Hatte das Thema ja schonmal, darauf hin kam das von mir:

http://www.proggen.org/doku.php?id=linu ... 86_64-i386

aber eben nicht im QT.

Aber das Thema mit Windows habe ich ebenfalls, nur dass ich da dann eben mit QT im Win7 arbeite... ;)

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Di Jul 10, 2012 5:30 pm
von nufan
Geschafft ^^ Jetzt sollte ich nur mehr wissen was ich alles gemacht habe... ^^

Zu allererst musst du die 32-Bit Version von Qt installieren. Das kannst du auch über den Paketmanager machen. Diese haben eine ":i386"-Endung, also zum Beispiel "libqtgui4:i386". Du solltest zumindest Core und Gui installieren, den Rest je nach Bedarf.
Jetzt brauchst du noch das Paket "libc6-dev-i386".
Nun solltest du alles am Rechner haben, was du zum Erstellen einer ELF32 brauchst. Bei der Installation der 32-Bit Bibliotheken wird aber ein entscheidender Fehler gemacht. Es werden nämlich keine Links erstellt, um die Bibliotheken mit ihrem richtigen Namen zu verwenden. Das kannst du relativ leicht verändern:

Code: Alles auswählen

$ cd /usr/lib32
$ sudo ln -s libstdc++.so.6 libstdc++.so
$ cd /usr/lib/i386-linux-gnu
$ sudo ln -s libQtCore.so.4 libQtCore.so
$ sudo ln -s libQtGui.so.4 libQtGui.so
Noch ein paar Qt-Konfigurationsdateien kopieren, die bei der 32-Bit Version nicht erstellt werden:

Code: Alles auswählen

$ cd /usr/lib/x86_64-linux-gnu
$ sudo cp *.prl ../i386-linux-gnu/
Jetzt kannst du mal deine Projekt-Datei erstellen.

Code: Alles auswählen

$ qmake -project
Du kannst nun entweder hier den "-m32"-Flag angeben, oder später direkt im Makefile ausbessern (da müssen wir sowieso noch ran).

Code: Alles auswählen

QMAKE_CFLAGS += -m32
QMAKE_CXXFLAGS += -m32
QMAKE_LFLAGS += -m32
Nun kann auch das Makefile erstellt werden:

Code: Alles auswählen

$ qmake
Wie gesagt muss am Makefile einiges geändert werden. Die zu ändernden Teile sind ziemlich offensichtlich. Das "-m64" muss weg und durch "-m32" ersetzt werden. Außerdem sind unsere Verzeichnisse für den Linker "/usr/lib/i386-linux-gnu/" und "/usr/lib32/". Noch ein paar Kleinigkeiten, die du sicher leicht selbst findest. Falls du dir schwer tust, erstell dir ein eigenes Makefile und sieh dir das diff an. Hier mein Makefile:

Code: Alles auswählen

#############################################################################
# Makefile for building: test
# Generated by qmake (2.01a) (Qt 4.8.1) on: Tue Jul 10 17:42:04 2012
# Project:  test.pro
# Template: app
# Command: /usr/bin/qmake -o Makefile test.pro
#############################################################################

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

CC            = gcc
CXX           = g++
DEFINES       = -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS        =  -pipe -m32 -O2 -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS      =  -pipe -m32 -O2 -Wall -W -D_REENTRANT $(DEFINES)
INCPATH       = -I/usr/share/qt4/mkspecs/linux-g++-32 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I.
LINK          = g++
LFLAGS        = -m32 -Wl,-O1 
LIBS          = $(SUBLIBS)  -L/usr/lib/i386-linux-gnu/ -L/usr/lib32/ -lQtGui -lQtCore -lpthread 
AR            = ar cqs
RANLIB        = 
QMAKE         = /usr/bin/qmake
TAR           = tar -cf
COMPRESS      = gzip -9f
COPY          = cp -f
SED           = sed
COPY_FILE     = $(COPY)
COPY_DIR      = $(COPY) -r
STRIP         = strip
INSTALL_FILE  = install -m 644 -p
INSTALL_DIR   = $(COPY_DIR)
INSTALL_PROGRAM = install -m 755 -p
DEL_FILE      = rm -f
SYMLINK       = ln -f -s
DEL_DIR       = rmdir
MOVE          = mv -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p

####### Output directory

OBJECTS_DIR   = ./

####### Files

SOURCES       = main.cpp 
OBJECTS       = main.o
DIST          = /usr/share/qt4/mkspecs/common/unix.conf \
		/usr/share/qt4/mkspecs/common/linux.conf \
		/usr/share/qt4/mkspecs/common/gcc-base.conf \
		/usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
		/usr/share/qt4/mkspecs/common/g++-base.conf \
		/usr/share/qt4/mkspecs/common/g++-unix.conf \
		/usr/share/qt4/mkspecs/qconfig.pri \
		/usr/share/qt4/mkspecs/modules/qt_phonon.pri \
		/usr/share/qt4/mkspecs/modules/qt_webkit_version.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/default_post.prf \
		/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.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 \
		/usr/share/qt4/mkspecs/features/include_source_dir.prf \
		test.pro
QMAKE_TARGET  = test
DESTDIR       = 
TARGET        = test

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 $(TARGET)

$(TARGET):  $(OBJECTS)  
	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

Makefile: test.pro  /usr/share/qt4/mkspecs/linux-g++-32/qmake.conf /usr/share/qt4/mkspecs/common/unix.conf \
		/usr/share/qt4/mkspecs/common/linux.conf \
		/usr/share/qt4/mkspecs/common/gcc-base.conf \
		/usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
		/usr/share/qt4/mkspecs/common/g++-base.conf \
		/usr/share/qt4/mkspecs/common/g++-unix.conf \
		/usr/share/qt4/mkspecs/qconfig.pri \
		/usr/share/qt4/mkspecs/modules/qt_phonon.pri \
		/usr/share/qt4/mkspecs/modules/qt_webkit_version.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/default_post.prf \
		/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.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 \
		/usr/share/qt4/mkspecs/features/include_source_dir.prf \
		/usr/lib/i386-linux-gnu/libQtGui.prl \
		/usr/lib/i386-linux-gnu/libQtCore.prl
	$(QMAKE) -o Makefile test.pro
/usr/share/qt4/mkspecs/common/unix.conf:
/usr/share/qt4/mkspecs/common/linux.conf:
/usr/share/qt4/mkspecs/common/gcc-base.conf:
/usr/share/qt4/mkspecs/common/gcc-base-unix.conf:
/usr/share/qt4/mkspecs/common/g++-base.conf:
/usr/share/qt4/mkspecs/common/g++-unix.conf:
/usr/share/qt4/mkspecs/qconfig.pri:
/usr/share/qt4/mkspecs/modules/qt_phonon.pri:
/usr/share/qt4/mkspecs/modules/qt_webkit_version.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/default_post.prf:
/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.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:
/usr/share/qt4/mkspecs/features/include_source_dir.prf:
/usr/lib/i386-linux-gnu/libQtGui.prl:
/usr/lib/i386-linux-gnu/libQtCore.prl:
qmake:  FORCE
	@$(QMAKE) -o Makefile test.pro

dist: 
	@$(CHK_DIR_EXISTS) .tmp/test1.0.0 || $(MKDIR) .tmp/test1.0.0 
	$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/test1.0.0/ && $(COPY_FILE) --parents main.cpp .tmp/test1.0.0/ && (cd `dirname .tmp/test1.0.0` && $(TAR) test1.0.0.tar test1.0.0 && $(COMPRESS) test1.0.0.tar) && $(MOVE) `dirname .tmp/test1.0.0`/test1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/test1.0.0


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


####### Sub-libraries

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


check: first

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:
compiler_moc_header_clean:
compiler_rcc_make_all:
compiler_rcc_clean:
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:
compiler_uic_clean:
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: 

####### Compile

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

####### Install

install:   FORCE

uninstall:   FORCE

FORCE:

Und hier ein paar Ausgaben:

Code: Alles auswählen

daniel@xps:~/test$ uname -a
Linux xps 3.2.0-26-generic #41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
daniel@xps:~/test$ make
g++ -c -pipe -m32 -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-32 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
g++ -m32 -Wl,-O1  -o test main.o    -L/usr/lib/i386-linux-gnu/ -L/usr/lib32/ -lQtGui -lQtCore -lpthread 
daniel@xps:~/test$ file test
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x82e53f9a66cafeaca2494ff0a6fa3c62885ca2c5, not stripped
Hab die ausführbare Datei auf einen anderen (32-Bit) Rechner kopiert und sie funktioniert :)
Bei Gelegenheit landet das natürlich im Wiki ^^

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Di Jul 10, 2012 7:15 pm
von nouseforname
Hey, super... werde das am Wochenende mal ausprobieren.

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Fr Jul 13, 2012 5:06 pm
von nouseforname
nouseforname hat geschrieben:Hey, super... werde das am Wochenende mal ausprobieren.

Habe nach Deiner Anleitung erfolgreich für 32bit kompilieren können. Habe noch ein paar Fehlermeldungen bzw. Warnungen beim Ausführen des Programms, aber ich habe bestimmt nur irgendeine lib vergessen zu linken.

Getestet habe ich das Programm in der VBox mit 32bit Ubuntu.


Danke nochmal.

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Fr Jul 13, 2012 7:07 pm
von nufan
nouseforname hat geschrieben:
nouseforname hat geschrieben:Hey, super... werde das am Wochenende mal ausprobieren.

Habe nach Deiner Anleitung erfolgreich für 32bit kompilieren können. Habe noch ein paar Fehlermeldungen bzw. Warnungen beim Ausführen des Programms, aber ich habe bestimmt nur irgendeine lib vergessen zu linken.
Sollte eigentlich nicht so sein?! Was kriegst du denn für eine Ausgabe? Vielleicht hast du vergessen auf dem Zielsystem eine Bibliothek zu installieren.

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Fr Jul 13, 2012 8:11 pm
von nouseforname
Ganz bestimmt habe ich etwas vergessen. Nicht schlimm, werde das später mal weiter verfolgen.

Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?

Verfasst: Sa Jul 14, 2012 4:44 pm
von nufan
http://www.proggen.org/doku.php?id=fram ... pile32on64
Ich hab auch das Problem mit dem Scrollen...

@nouseforname: Vielleicht können wir das mit den fehlenden Bibliotheken irgendwann klären, ich würde das gerne noch einbauen.