QT unter Ubuntu 64 für 32bit kompilieren, wie?
-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
QT unter Ubuntu 64 für 32bit kompilieren, wie?
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.
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?
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.
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.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?
Ich habe mal ein GTK-Programm auf Linux für Windows kompiliert. Das ist zumindest nah dran am Problem.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.

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?
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...
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?
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:
Noch ein paar Qt-Konfigurationsdateien kopieren, die bei der 32-Bit Version nicht erstellt werden:
Jetzt kannst du mal deine Projekt-Datei erstellen.
Du kannst nun entweder hier den "-m32"-Flag angeben, oder später direkt im Makefile ausbessern (da müssen wir sowieso noch ran).
Nun kann auch das Makefile erstellt werden:
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:
Und hier ein paar Ausgaben:
Hab die ausführbare Datei auf einen anderen (32-Bit) Rechner kopiert und sie funktioniert 
Bei Gelegenheit landet das natürlich im Wiki ^^
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
Code: Alles auswählen
$ cd /usr/lib/x86_64-linux-gnu
$ sudo cp *.prl ../i386-linux-gnu/
Code: Alles auswählen
$ qmake -project
Code: Alles auswählen
QMAKE_CFLAGS += -m32
QMAKE_CXXFLAGS += -m32
QMAKE_LFLAGS += -m32
Code: Alles auswählen
$ qmake
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:
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

Bei Gelegenheit landet das natürlich im Wiki ^^
-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?
Hey, super... werde das am Wochenende mal ausprobieren.
-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?
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?
Sollte eigentlich nicht so sein?! Was kriegst du denn für eine Ausgabe? Vielleicht hast du vergessen auf dem Zielsystem eine Bibliothek zu installieren.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.
-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: QT unter Ubuntu 64 für 32bit kompilieren, wie?
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?
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.
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.