Hint
If you don’t need specifically qt-mac-free-3.3.4 but any 3.3.x would do it, you might want to check out Trolltech’s recently published Version 3.3.5. If you ever wondered – like me – where you can still download the 3.3.x branch have a look at
ftp://ftp.trolltech.com/qt/source/
It seems that you can’t find any more download links for 3.3.x at Trolltech’s webpage.
Issue
When I tried to compile Qt for Mac 3.3.4 from source on Max OS X Tiger 10.4.2 with gcc-4.0.0 the compiler complained:
kernel/qaccessible_mac.cpp:189: error: non-local variable '<anonymous struct> text_bindings [][10]' uses anonymous type make[2]: *** [.obj/release-shared/qaccessible_mac.o] Error 1 make[1]: *** [sub-src] Error 2 make: *** [init] Error 2
and
network/qsocketdevice_unix.cpp: In function `int qt_socket_accept(int, sockaddr*, int*)': network/qsocketdevice_unix.cpp:47: error: invalid conversion from 'int*' to 'socklen_t*' network/qsocketdevice_unix.cpp:47: error: initializing argument 3 of 'int accept(int, sockaddr*, socklen_t*)' network/qsocketdevice_unix.cpp: In member function `QSocketDevice::Protocol QSocketDevice::getProtocol() const': network/qsocketdevice_unix.cpp:132: error: invalid conversion from 'int*' to 'socklen_t*' network/qsocketdevice_unix.cpp:132: error: initializing argument 3 of 'int getsockname(int, sockaddr*, socklen_t*)' network/qsocketdevice_unix.cpp: In member function `int QSocketDevice::option(QSocketDevice::Option) const': network/qsocketdevice_unix.cpp:324: error: invalid conversion from 'int*' to 'socklen_t*' network/qsocketdevice_unix.cpp:324: error: initializing argument 5 of 'int getsockopt(int, int, int, void*, socklen_t*)' network/qsocketdevice_unix.cpp: In member function `virtual Q_LONG QSocketDevice::readBlock(char*, Q_ULONG)': network/qsocketdevice_unix.cpp:784: error: invalid conversion from 'int*' to 'socklen_t*' network/qsocketdevice_unix.cpp:784: error: initializing argument 6 of 'ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*) network/qsocketdevice_unix.cpp: In member function `void QSocketDevice::fetchConnectionParameters()': network/qsocketdevice_unix.cpp:1053: error: invalid conversion from 'int*' to 'socklen_t*' network/qsocketdevice_unix.cpp:1053: error: initializing argument 3 of 'int getsockname(int, sockaddr*, socklen_t*)' network/qsocketdevice_unix.cpp:1057: error: invalid conversion from 'int*' to 'socklen_t*' network/qsocketdevice_unix.cpp:1057: error: initializing argument 3 of 'int getpeername(int, sockaddr*, socklen_t*)' make[2]: *** [.obj/release-shared/qsocketdevice_unix.o] Error 1 make[1]: *** [sub-src] Error 2 make: *** [init] Error 2
Additionally with both compilers gcc 4.0 and gcc 3.3 linking an application against qt-mac-free-3.3.4 resulted in warning messages like the following, because Mac OS X Tiger comes with additional dynamic library handling functions which now conflict with qt:
/usr/bin/ld: warning multiple definitions of symbol _dlsym /usr/lib/gcc/powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) definition of _dlsym /usr/local/lib/libqt-mt.dylib(dlfcn.o) definition of _dlsym /usr/bin/ld: warning multiple definitions of symbol _dladdr /usr/lib/gcc/powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) definition of _dladdr /usr/local/lib/libqt-mt.dylib(dlfcn.o) definition of _dladdr /usr/bin/ld: warning multiple definitions of symbol _dlclose /usr/lib/gcc/powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) definition of _dlclose /usr/local/lib/libqt-mt.dylib(dlfcn.o) definition of _dlclose /usr/bin/ld: warning multiple definitions of symbol _dlerror /usr/lib/gcc/powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) definition of _dlerror /usr/local/lib/libqt-mt.dylib(dlfcn.o) definition of _dlerror /usr/bin/ld: warning multiple definitions of symbol _dlopen /usr/lib/gcc/powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) definition of _dlopen /usr/local/lib/libqt-mt.dylib(dlfcn.o) definition of _dlopen /usr/bin/ld: warning suggest use of -bind_at_load, as lazy binding may result in errors or different symbols being used symbol _dladdr used from dynamic library /usr/lib/gcc/ powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) not from earlier dynamic library libqt-mt.3.dylib(dlfcn.o) symbol _dlclose used from dynamic library /usr/lib/gcc/ powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) not from earlier dynamic library libqt-mt.3.dylib(dlfcn.o) symbol _dlerror used from dynamic library /usr/lib/gcc/ powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) not from earlier dynamic library libqt-mt.3.dylib(dlfcn.o) symbol _dlopen used from dynamic library /usr/lib/gcc/ powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) not from earlier dynamic library libqt-mt.3.dylib(dlfcn.o) symbol _dlsym used from dynamic library /usr/lib/gcc/ powerpc-apple-darwin8/4.0.0/../../../libpthread.dylib (dyldAPIsInLibSystem.o) not from earlier dynamic library libqt-mt.3.dylib(dlfcn.o)
Solution
Apply the following patch:
Patch instructions
Extract sources and apply patch:
tar xjf qt-mac-free-3.3.4.tar.bz2 cd qt-mac-free-3.3.4 patch -p1 <../qt-mac-free-3.3.4-tiger.diff
Please make sure that the paths are adjusted to your system. Follow the official build instructions afterwards. After applying the little patch qt-mac-free-3.3.4 and applications linked to it should build fine with gcc 4.0 and gcc 3.3.
References
My patch is based on the following Articles: