Компиляция и линковка проекта x86 в системе x86_64

И так, захотелось собрать свой проект на 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

Все, теперь линковка пройдет как по маслу.

Related Articles

Free Joomla! templates by Engine Templates