И так, захотелось собрать свой проект на Qt4 под Ubuntu 10.10 x86_64. Все бы ничего, но есть одно но - компоненты которые есть только под архитектуру x86, со всеми вытекающими последствиями.
Все по порядку. Что мы имеем:
$uname -a Linux 2.6.35-23-generic #40-Ubuntu SMP Wed Nov 17 22:14:33 UTC 2010 x86_64 GNU/Linux
$qmake-qt4 -version QMake version 2.01a Using Qt version 4.7.0 in /usr/lib
$g++ -v Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Библиотеки с хедарами GisToolKit под 32 битные процы. |
Если делаем все стандартно, то при компиляции будем иметь следующие ошибки:
/usr/include/gisapi/mapsyst.h: In function ‘int StringToUnicode(const char*, WCHAR*, int)’: /usr/include/gisapi/mapsyst.h:596: error: cast from ‘void*’ to ‘int’ loses precision /usr/include/gisapi/mapsyst.h: In function ‘int UnicodeToString(const WCHAR*, char*, int)’: /usr/include/gisapi/mapsyst.h:644: error: cast from ‘void*’ to ‘int’ loses precision /usr/include/gisapi/mapsyst.h: In function ‘int GetTheCurrentDirectory(char*, long int)’: /usr/include/gisapi/mapsyst.h:1744: error: cast from ‘char*’ to ‘int’ loses precision |
что не удивительно.
Исправляем ситуацию.
Для того что бы компилятор не ругался на такое, ему нужно в параметрах кинуть опцию -m32. Для удобства лучше прописать это в *.pro файле(Проекте). Нам понадобится два флага: первый для компиляции, второй для линковки.
QMAKE_CXXFLAGS += -m32 QMAKE_LFLAGS += -m32 |
Также указываем, что нужно брать lib32 библиотеки:
LIBS +=-L/usr/lib32 |
Ставим из репов нужные библиотеки для поддержки : ia32-libs lib32*
Все, можно делать qmake-qt4 && make. Одно но, при линковке будут сообщения типа:
/usr/bin/ld: skipping incompatible /usr/lib/libQtOpenGL.so when searching for -lQtOpenGL /usr/bin/ld: skipping incompatible /usr/lib/libQtGui.so when searching for -lQtGui /usr/bin/ld: skipping incompatible /usr/lib/libQtCore.so when searching for -lQtCore /usr/bin/ld: skipping incompatible /usr/lib/libGLU.so when searching for -lGLU /usr/bin/ld: skipping incompatible /usr/lib/libGLU.a when searching for -lGLU /usr/bin/ld: skipping incompatible /usr/lib/libGL.so when searching for -lGL /usr/bin/ld: skipping incompatible /usr/lib/libpthread.so when searching for -lpthread /usr/bin/ld: skipping incompatible /usr/lib/libpthread.a when searching for -lpthread /usr/bin/ld: skipping incompatible /usr/lib/libm.so when searching for -lm /usr/bin/ld: skipping incompatible /usr/lib/libm.a when searching for -lm /usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc /usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc |
Но бинарник мы все равно получим. Кому не нравятся ругань ликнковщика делаем следующие:
Ручками правим Makefile, строчку LIBS, и удаляем из неё упоминание о -L/usr/lib
Все, теперь линковка пройдет как по маслу.