PDA

View Full Version : how to correctly compile threads support?



srhlefty
23rd June 2006, 03:43
Hi all, I've just recently downloaded and attempted to compile the opensource version of qt4.1.3.
The program that I'm trying to install which required qt says it must have thread support, in other words the library libqt-mt.
I'm using SuSe 10.1, which has qt3 installed from an rpm, and there already exists the file libqt-mt.so.3 in my /usr/lib directory. BUT if I write a hello world program and try to link to it using -lqt-mt, ld gives me the error

ld: skipping incompatible /usr/lib/libqt-mt.so when searching for -lqt-mt
ld: cannot find -lqt-mt
collect2: ld returned 1 exit status
so there must be something either wrong with the library, or maybe I have to have a libqt-mt.a, or something.

So here I am, trying to install the latest qt4, hoping that it will fix the problem. qt4 compiles just fine, with no errors, when I do this:

./configure
gmake
gmake install

Now, if I may quote from http://doc.trolltech.com/3.3/threads.html, TrollTech's installation guide for enabling multithreading in qt3,


On Mac OS X and Unix, thread support is enabled by adding the -thread option when running the configure script. On Unix platforms where multithreaded programs must be linked in special ways, such as with a special libc, installation will create a separate library, libqt-mt and hence threaded programs must be linked against this library (with -lqt-mt) rather than the standard Qt library.

On both platforms, you should compile with the macro QT_THREAD_SUPPORT defined (e.g. compile with -DQT_THREAD_SUPPORT).


However, when I execute the command

./configure -thread
I get as a response

-thread: invalid command-line switch
I have also tried running

./configure
gmake -DQT_THREAD_SUPPORT
gmake install
but this still does not result in the creation of a libqt-mt.a.

The guide for installing qt4, http://doc.trolltech.com/4.1/install-x11.html, makes no mention of threads at all--so I'm guessing they are already included--so then why is there no libqt-mt created? Perhaps that program I'm trying to install (Kompose) must have qt3 not qt4? :confused:

I would greatly appreciate any help you can give me! :D

jacek
23rd June 2006, 10:45
The program that I'm trying to install which required qt says it must have thread support, in other words the library libqt-mt.
Most likely that program requires Qt3 and it won't run with Qt4.


ld: skipping incompatible /usr/lib/libqt-mt.so when searching for -lqt-mt
ld: cannot find -lqt-mt
For some reason it doesn't like that library. Do you have a 64-bit processor?


Now, if I may quote from TrollTech's installation guide for enabling multithreading in qt3
...
However, when I execute the command
...
but this still does not result in the creation of a libqt-mt.a.
Qt4 libraries are always multithreaded, but Qt4 is not backward-compatible with Qt3, so you can't use it instead of Qt3. Instructions from Qt3 docs won't work with Qt4 either.

srhlefty
23rd June 2006, 17:00
Thanks for the info jacek!

For some reason it doesn't like that library. Do you have a 64-bit processor?

You guessed it! :D
AMD dual core 64-bit, no less. What effect is this going to have on installing a different version of qt? This incompatibility trend seems to continually haunt me...maybe I should have installed SuSe for 32 bit instead..but that's a project for another day :)

I assume this means I should be trying to compile qt3 instead, right? But maybe that won't work either because most of my libraries installed from rpm are 64 bit.

I tried compiling this morning qt-x11-free-3.3.6, with the -thread option in configure, and it configured ok but upon a gmake I received compiler errors of the form:

./qcstring.o: In function `qChecksum(char const*, unsigned int)':
qcstring.cpp:(.text+0x605): undefined reference to `qt_global_mutexpool'
qcstring.cpp:(.text+0x61a): undefined reference to `QMutexPool::get(void*)'
qcstring.cpp:(.text+0x62a): undefined reference to `QMutex::lock()'
qcstring.cpp:(.text+0x640): undefined reference to `QMutex::unlock()'
repeated over and over again in a bunch of different source files. These seem to indicate that although configure worked, there's some sort of missing threads library it can't seem to link to, so all the functions related to multithreading aren't linking properly.

Any ideas here, or am I just beating a dead horse?

jacek
23rd June 2006, 19:48
AMD dual core 64-bit, no less.
You must be very lucky. ;)


I assume this means I should be trying to compile qt3 instead, right?
In my distribution (PLD Linux) there is a package with Qt 3.3.6 for AMD 64, so it should be available in SuSE too.


I tried compiling this morning qt-x11-free-3.3.6, with the -thread option in configure, and it configured ok but upon a gmake I received compiler errors of the form:
Could you try to find the first error message?


These seem to indicate that although configure worked, there's some sort of missing threads library it can't seem to link to, so all the functions related to multithreading aren't linking properly.
You're right, probably you are missing a 64-bit version of some library that Qt depends on.

srhlefty
24th June 2006, 03:52
In my distribution (PLD Linux) there is a package with Qt 3.3.6 for AMD 64, so it should be available in SuSE too.
Here are the qt packages on my install DVD:

qt3-32bit-3.3.5-58.x86_64.rpm
qt3-3.3.5-58.x86_64.rpm
qt3-devel-32bit-3.3.5-58.x86_64.rpm
qt3-devel-3.3.5-58.x86_64.rpm
qt3-devel-tools-3.3.5-58.x86_64.rpm
qt3-examples-3.3.5-58.x86_64.rpm
qt3-man-3.3.5-58.x86_64.rpm
qt3-mysql-3.3.5-58.x86_64.rpm
qt3-postgresql-3.3.5-58.x86_64.rpm
qt3-sqlite-3.3.5-58.x86_64.rpm
qt3-unixODBC-3.3.5-58.x86_64.rpm
I opened up KPackage, and it appears that the ones that I have installed are
qt3-devel-32bit-3.3.5-58.x86_64.rpm, and
qt3-devel-3.3.5-58.x86_64.rpm
Could it be that I need to install qt3-3.3.5-58.x86_64.rpm? If so, how do I make sure it installs it with the -thread option--I was under the impression that rpm's are already compiled, so if this particular build was not built with that option, it wouldn't matter if I had the correct rpm or not!


Could you try to find the first error message?
Actually, that is the first error message. Here's the full output:

gmake[1]: Entering directory `/usr/local/qt3'
cd qmake && gmake
gmake[2]: Entering directory `/usr/local/qt3/qmake'
gmake[2]: `qmake' is up to date.
gmake[2]: Leaving directory `/usr/local/qt3/qmake'
cd src/moc && gmake
gmake[2]: Entering directory `/usr/local/qt3/src/moc'
test -d ../../bin/ || mkdir -p ../../bin/
g++ -o ../../bin/moc ./qbuffer.o ./qptrcollection.o ./qcstring.o ./qdatastream.o ./qdatetime.o ./qfile.o ./qdir.o ./qfileinfo.o ./qgarray.o ./qgdict.o ./qglist.o ./qglobal.o ./qgvector.o ./qiodevice.o ./qregexp.o ./qstring.o ./qlocale.o ./qunicodetables.o ./qstringlist.o ./qtextstream.o ./qbitarray.o ./qmap.o ./qgcache.o ./qtextcodec.o ./qutfcodec.o ./moc_yacc.o ./qfile_unix.o ./qdir_unix.o ./qfileinfo_unix.o
./qcstring.o: In function `qChecksum(char const*, unsigned int)':
qcstring.cpp:(.text+0x605): undefined reference to `qt_global_mutexpool'
qcstring.cpp:(.text+0x61a): undefined reference to `QMutexPool::get(void*)'
qcstring.cpp:(.text+0x62a): undefined reference to `QMutex::lock()'
qcstring.cpp:(.text+0x640): undefined reference to `QMutex::unlock()'
./qgarray.o: In function `QGArray::sort(unsigned int)':
qgarray.cpp:(.text+0xdb3): undefined reference to `qt_global_mutexpool'
qgarray.cpp:(.text+0xdc5): undefined reference to `QMutexPool::get(void*)'
qgarray.cpp:(.text+0xdd5): undefined reference to `QMutex::lock()'
qgarray.cpp:(.text+0xe4b): undefined reference to `QMutex::unlock()'
./qgarray.o: In function `QGArray::bsearch(char const*, unsigned int) const':
qgarray.cpp:(.text+0xe97): undefined reference to `qt_global_mutexpool'
qgarray.cpp:(.text+0xeaf): undefined reference to `QMutexPool::get(void*)'
qgarray.cpp:(.text+0xec5): undefined reference to `QMutex::lock()'
qgarray.cpp:(.text+0xf7a): undefined reference to `QMutex::unlock()'
qgarray.cpp:(.text+0xfaf): undefined reference to `QMutex::unlock()'
./qgarray.o: In function `QGArray::sort(unsigned int)':
qgarray.cpp:(.text+0xe17): undefined reference to `QMutex::unlock()'
./qgvector.o: In function `QGVector::sort()':
qgvector.cpp:(.text+0xa2b): undefined reference to `qt_global_mutexpool'
qgvector.cpp:(.text+0xa3c): undefined reference to `QMutexPool::get(void*)'
qgvector.cpp:(.text+0xa4c): undefined reference to `QMutex::lock()'
qgvector.cpp:(.text+0xac5): undefined reference to `QMutex::unlock()'
qgvector.cpp:(.text+0xa8e): undefined reference to `QMutex::unlock()'
./qregexp.o: In function `regexpEngine(QRegExpEngine*&, QString const&, bool, bool)':
qregexp.cpp:(.text+0x7a29): undefined reference to `QThreadInstance::current()'
qregexp.cpp:(.text+0x7a3e): undefined reference to `QThreadStorageData::get() const'
qregexp.cpp:(.text+0x7b3b): undefined reference to `QThreadStorageData::QThreadStorageData(void (*)(void*))'
qregexp.cpp:(.text+0x7b9e): undefined reference to `QThreadStorageData::set(void*)'
qregexp.cpp:(.text+0x7be8): undefined reference to `QThreadStorageData::set(void*)'
./qregexp.o: In function `__tcf_0':
qregexp.cpp:(.text+0x206): undefined reference to `QThreadStorageData::~QThreadStorageData()'
./qtextcodec.o: In function `QTextCodec::deleteAllCodecs()':
qtextcodec.cpp:(.text+0x9b7): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x9c9): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x9d9): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0xabd): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::QTextCodec()':
qtextcodec.cpp:(.text+0x1964): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x1975): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x1985): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0x19a0): undefined reference to `QMutex::unlock()'
qtextcodec.cpp:(.text+0x19c1): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::QTextCodec()':
qtextcodec.cpp:(.text+0x21a4): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x21b5): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x21c5): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0x21e0): undefined reference to `QMutex::unlock()'
qtextcodec.cpp:(.text+0x2201): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::codecForContent(char const*, int)':
qtextcodec.cpp:(.text+0x2231): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x2246): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x2256): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0x2271): undefined reference to `QMutex::unlock()'
qtextcodec.cpp:(.text+0x231a): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::codecForName(char const*, int)':
qtextcodec.cpp:(.text+0x2408): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x2419): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x2429): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0x2444): undefined reference to `QMutex::unlock()'
qtextcodec.cpp:(.text+0x2466): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::codecForLocale()':
qtextcodec.cpp:(.text+0x254d): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x255e): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x256e): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0x2585): undefined reference to `QMutex::unlock()'
qtextcodec.cpp:(.text+0x25ae): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::codecForMib(int)':
qtextcodec.cpp:(.text+0x26e0): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x26f1): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x2701): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0x271c): undefined reference to `QMutex::unlock()'
qtextcodec.cpp:(.text+0x2741): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::codecForIndex(int)':
qtextcodec.cpp:(.text+0x2765): undefined reference to `qt_global_mutexpool'
qtextcodec.cpp:(.text+0x2776): undefined reference to `QMutexPool::get(void*)'
qtextcodec.cpp:(.text+0x2786): undefined reference to `QMutex::lock()'
qtextcodec.cpp:(.text+0x279d): undefined reference to `QMutex::unlock()'
qtextcodec.cpp:(.text+0x27f6): undefined reference to `QMutex::unlock()'
./qtextcodec.o: In function `QTextCodec::deleteAllCodecs()':
qtextcodec.cpp:(.text+0xa88): undefined reference to `QMutex::unlock()'
./qdir_unix.o: In function `QDir::drives()':
qdir_unix.cpp:(.text+0x29b): undefined reference to `qt_global_mutexpool'
qdir_unix.cpp:(.text+0x2ac): undefined reference to `QMutexPool::get(void*)'
qdir_unix.cpp:(.text+0x2bc): undefined reference to `QMutex::lock()'
qdir_unix.cpp:(.text+0x2d3): undefined reference to `QMutex::unlock()'
qdir_unix.cpp:(.text+0x386): undefined reference to `QMutex::unlock()'
collect2: ld returned 1 exit status
gmake[2]: *** [../../bin/moc] Error 1
gmake[2]: Leaving directory `/usr/local/qt3/src/moc'
gmake[1]: *** [src-moc] Error 2
gmake[1]: Leaving directory `/usr/local/qt3'
gmake: *** [init] Error 2

jacek
24th June 2006, 13:49
it appears that the ones that I have installed are
qt3-devel-32bit-3.3.5-58.x86_64.rpm, and
qt3-devel-3.3.5-58.x86_64.rpm
Then probably you also have all required libraries installed too.


Could it be that I need to install qt3-3.3.5-58.x86_64.rpm?
Yes, but if you have a corresponding *-devel package, it should be already installed on your system. You can check it using rpm:
$ rpm -qi qt3-3.3.5-58To see if you have a qt-mt library run:
$ rpm -ql qt3-3.3.5-58 | grep qt-mt
If for some reason you don't have qt3 package installed, you can see if it contains the qt-mt library using:
$ rpm -qpl qt3-3.3.5-58.x86_64.rpm | grep qt-mt
Since you have both 32-bit and 64-bit Qt installed, make sure that QTDIR environment variable is set correctly.


Actually, that is the first error message.
This might mean that the problem lies in some macro definitions or the configuration.

srhlefty
24th June 2006, 20:56
Both main qt3 rpm's are already installed.


To see if you have a qt-mt library run:

$ rpm -ql qt3-3.3.5-58 | grep qt-mt
This returns

/usr/lib/qt3/lib64/libqt-mt.so.3
/usr/lib/qt3/lib64/libqt-mt.so.3.3
/usr/lib/qt3/lib64/libqt-mt.so.3.3.5
/usr/lib64/libqt-mt.so.3
These are the same files returned by

rpm -qpl qt3-3.3.5-58.x86_64.rpm | grep qt-mt
My QTDIR is set to /usr/lib/qt3

I know this seems a little like cutting my losses and moving on, but I just found an rpm of the program I wanted to install, and after finding a few other rpm's to satisfy dependencies it installed ok. So the binary qt libraries must be working ok with the binary program--it's just that I can't compile the program from source.
So I don't think I'm going to fiddle with trying to get qt to compile correctly any more, but if you have more ideas I'll certainly give them a try.
Thank you so much for your patience and advice, it gave me some insights as to how all this stuff is put together.

jacek
24th June 2006, 22:34
My QTDIR is set to /usr/lib/qt3
How about QMAKESPEC variable? Is it set? Also check where $QTDIR/mkspecs/default link points to.

If you are going to compile Qt again, try running:
export QMAKESPEC=linux-g++-64before the configure utility.

srhlefty
25th June 2006, 08:26
QMAKESPEC wasn't set, so I set it like you suggested, then ran configure again (after doing a gmake confclean of course). I checked where /usr/local/qt3/mkspecs/default points to, and it points to the linux-g++-64 folder. I'm guessing that means it doesn't matter what QMAKESPEC was set to anyway, since that's my arch?

Gmake'ing gave the same set of errors. :(

jacek
25th June 2006, 20:15
Then maybe configure utility has some problems with detecting that your system is 64-bit?