Qt Creator + Qt 4.7.3 on Mac OS 10.6 - always builds x86_64, but I need 32 bit.
I'm compiling my Qt app on Mac OS 10.6.8 with the latest Qt Creator (2.2.1) and Qt 4.7.3 installed from the Online Installer.
When I compile my app that uses some 3rd party libraries built for x86 and PPC in Qt Creator, I get "missing required architecture x86_64 in file...." errors. So obviously it is compiling for 64 bits - which I don't need.
In my .pro file I have:
CONFIG -= x86_64 CONFIG +=x86 ppc
Which I understand will tell the compiler to not build for 64 bits.
When I look at the "Build Settings" for my project I notice:
"Qt version" is "Desktop Qt 4.7.3 for GCC (Qt SDK)" and is grayed out.
"Tool chain" is "GCC (x86 64bit)" and also grayed out.
I'm not sure why only 64 bit compiles are available. Should I be able to select to use 32 bits in the "Build Settings"?
Also shouldn't my settings in the .pro file remove the 64 bit build, and add x86 32 bit and PCC?
I don't remember seeing any options during the Qt install to select the defaults.
How can I tell Qt Creator to only build for 32 bit x86 and PPC?
I won't say for sure, especially since I don't use Mac OS, but probably the libraries you link against are 64bit (that's the case in Linux anyway). So, in order to compile x86, you'll have to compile Qt in x86, or use the source files instead of the lib. Mind you, I might be wrong, I myself am happy with x86_64, and have not actually tried compiling for other architectures. Also, this might be some special case of Mac that I'm not aware of.
The Qt version being greyed out shows that you only have that one available for the target you develop for. So the first thing is which ABIs does it support? Please check in Tools->Options->Qt versions and hover the Qt version in question. Check the tooltip for information on the supported ABIs. If there is no 32bit version there, then you will need to install a Qt that actually was compiled for a 32bit environment.
If that lists 32bit, then you might not be able to build a 32bit version because Qt Creator did not find any 32bit tool chain on your system: Please check in Tools->Options->Tool chains and make sure you have tool chains defined for all ABIs of the Qt version.
I'm using Qt from the online installer for Mac OS.
The Qt version tool tip shows:
On the Tool Chains panel it shows:
GCC (x86 64bit) GCC
GCC (x86 32bit) GCC
GCC (ppc 64bit) GCC
GCC (ppc 32bit) GCC
So it looks like it has 32 bits in the tool chain - correct?
Then why does it compile and link against 64 bit stuff? I get errors because some of the Carbon APIs I use aren't available in 64 bit. If I remove those temporarily, when it gets to linking it says that my external frameworks are missing 64bit architecture (which I know - but I don't want a 64 bit app anyway).
Here is some output from the compile window, which seems to prove the compiler is being directed to make a 64 bit version:
g++ -c -pipe -O2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -arch ppc -arch i386 -Wall -W -isysroot /Developer/SDKs/MacOSX10.5.sdk -DNDEBUG -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../../../QtSDK/Desktop/Qt/473/gcc/mkspecs/macx-g++ -I../
I see there are multiple -arch parameters there. So where are the "-arch x86_64 -Xarch_x86_64" coming from? In my pro file I have :
CONFIG -= x86_64
CONFIG +=x86 ppc
I've also tried with just:
CONFIG +=x86 ppc
Looks like we are having trouble to pick the correct mkspec. As a workaround you can specify the mkspec you want via the qmake build step widget (Projects->Build Settings, somewhere in the middle of the page). I am not sure there actually is one available to build for 32bit PPC on Mac though.
Please "file a bug report":http://bugreports.qt.nokia.com/ if you find one:-)
OK I filed a bug report:
Sorry but I'm not quite sure how I would specify the mkspec to not tell the compiler to use "-arch x86_64 -Xarch_x86_64".
FYI - I have Xcode 3.2.6 installed and it will compile my app OK as 32 bit only when creating an XCode project from the .pro file.
You can add to your .pro file:
CONFIG -= x86_64 ppc64
CONFIG += x86 ppc
The first line removes the 64bit targets that may have been added by the qmake build system. The second line ensures that the 32bit version for Intel and PPC processors are built.
That didn't work. I did a clean and rebuild of my app but I still see "-arch x86_64 -Xarch_x86_64" in the compile output. It's like it is totally ignoring it.
The following may be useful:
If in Qt Creator I go to the Build Settings, General and change the "Qt Version" from "Desktop Qt 4.7.3 for CGG (SDK)" to "Qt in PATH", then do a clean rebuild of my app I no longer get any of the x64 stuff included.
Does that mean something is messed up with my Qt install?
I don't know for sure, I never installed Qt from the SDK, but it may be that the SDK only delivers universal binaries containing intel code and/or containing only 64bit code. You can check yourself with
lipo -info /path/to/your/SDK/libs/QtGui.framework/QtGui
The output will containt i386 and ppc7400 for Intel and PPC 32bit, and x86_64 for Intel 64bit.
Also, make sure that the command line for qmake in the build settings pane, does not contain any arch related stuff, as this can override the settings in the .pro file.
Are you sure the tooltip is from the Qt version you used to build? The one you caim to be using is 64bit only when I check it on the mac.
Please update the bug report with this information. Thanks!
I had the same problem. My solution was to download Qt source and compile it both for i386 and x86_64.
michkol: Are you building that as a fat binary or as two separate binaries?
I compiled it as a fat library. As someone said, the shipped binaries come as a 64 version only. When built from scratch, you can choose your compiler.
I just stumbled across this problem myself, though I don't fully understand it.
I'm running Creator 2.3.0, based on Qt 4.7.4 (64 bit).
So, do I understand correctly that I can't control which GCC the build process uses? In Preferences -> Tool Chains, I have Auto-detected entries for both 64 and 32 bit (as well as some PPC entries which I should probably get rid of). 64 is listed first, so I assumed that's why I was getting 64-bit integers in my code. Not so?
The toolchain on the Mac is a single one (although Creatore reports at least two). You have only one gcc (per version, you have gcc-4.0 and gcc-4.2 of course). This gcc can produce object code for Intel and PowerPC and for 32 and 64 bit, make four architectures altogether.
BUT: You cannot create an object file containing, let's say 32 and 64 bit Intel code, in case your Qt libs only contains 64 bit Intel code. In the end, the linker would complain that some code is missing.
I never used the prebuilt binaries or SDKs for the Mac myself, so I cannot tell you what's inside. You can find out yourself:
It should print something like: Architectures in the fat file: /usr/local/Trolltech/Qt-4.7.3/lib/QtGui.framework/QtGui are: i386 ppc7400 - the architectures listed differ, of course :-)
By manipulating the CONFIG variable you control for which architectures code will be built.
OK, this might sound like an incredibly dumb question, but...how do I determine the path to my library? I've got so many Qt files and folders all over the place, I'm not sure which is which.
I don't know if this information is any help, but...
I also have a 4.7.3 version on my system. When I deleted it, the debugger didn't work right, so I put it back. It seems that I have some unnecessary stuff floating around...I'd like to get rid of it if possible.
Hi, Volker -
I found a directory that may be the one I want use for the lipo command, but I get an error:
bq. Macintosh-d49a20f3c0dc:~ mzimmers$ lipo /Developer/Applications/Qt/Desktop/Qt/474/gcc/lib/QtGui.framework
lipo: one of -create, -thin <arch_type>, -extract <arch_type>, -remove <arch_type>, -replace <arch_type> <file_name>, -verify_arch <arch_type> ... , -info or -detailed_info must be specified
lipo: Usage: lipo [input_file] ... [-arch <arch_type> input_file] ... [-info] [-detailed_info] [-output output_file] [-create] [-arch_blank <arch_type>] [-thin <arch_type>] [-remove <arch_type>] ... [-extract <arch_type>] ... [-extract_family <arch_type>] ... [-verify_arch <arch_type> ...] [-replace <arch_type> <file_name>] ...
Does lipo need an argument?
Sorry, I forgot an argument, it's actually:
lipo -info /Developer/Applications/Qt/Desktop/Qt/474/gcc/lib/QtGui.framework
Hi, Volker. Now I get this:
@Macintosh-d49a20f3c0dc:~ mzimmers$ lipo -info /Developer/Applications/Qt/Desktop/Qt/474/gcc/lib/QtGui.framework
lipo: Can't map input file: /Developer/Applications/Qt/Desktop/Qt/474/gcc/lib/QtGui.framework (Invalid argument)
lipo -info /Developer/Applications/Qt/Desktop/Qt/474/gcc/lib/QtGui.framework/QtGui@
the first one was a directory. Just cd into the to see what's in it.
OK, now we're getting somewhere:
@Macintosh-d49a20f3c0dc:~ mzimmers$ lipo -info /Developer/Applications/Qt/Desktop/Qt/474/gcc/lib/QtGui.framework/QtGui
Non-fat file: /Developer/Applications/Qt/Desktop/Qt/474/gcc/lib/QtGui.framework/QtGui is architecture: x86_64
So...where do I go from here? And, is there a way to be sure that this is indeed the path that Creator is using, since I seem to have a few versions hanging around?
Ok, that's what I suspected, but never could prove myself: The prebuilt Qt binaries from the SDK only contain code for Intel 64bit.
The only solution for a requirement that contains any 32bit support, is to build Qt manually. Make sure to add
-arch x86 -arch ppc
to your configure call (x86 = 32 bit Intel, ppc = 32 bit PowerPC). You might want to add
too, in case you need 64 bit Intel too.
when you say my "configure call," what are you talking about - the lipo command? I should only have to do that once, right?
Ahm, no. You will have to get the sources from the "download page":http://qt.nokia.com/downloads/downloads#qt-lib and do the usual configure, make, make install steps. See the "general installation guide":http://developer.qt.nokia.com/doc/qt-4.7/installation.html and the "Mac installation guide":http://developer.qt.nokia.com/doc/qt-4.7/install-mac.html for detailed instructions.
Thanks, Volker. I appreciate the help with this.
I don't think I'm ready to start building my own tools, though. The only reason this is of interest to me (at the moment) is that I recently realized that a version change of Qt seems to have altered my compiler's behavior a bit. Specifically, a "long" declaration used to give me a 32-bit value, but now gives me a 64-bit value. I think I'll just edit my program to replace all the longs with int32_ts. I need this code to work on Windows, too.
Ah, I see.
For the building: It's really not a big deal. The default settings of the configure script are sane, so you hardly need to change things. Once you get used to it, you like it :-)
Well, OK, maybe I'll try it. I imagine that I'll still have to go through my code and change the longs to int32_ts, though, won't I? Unless there's some compiler flag I can use that does this.
That depends on your use case. An "upgrade" from 32 to 64 bit usually doesn't harm that much :-)
I would recommend using qint32 or quint32 typedefs of Qt for this (there are 16 and 64 bit typedefs too).
I don't think I want to use the Qt typedefs (at least not yet); there's a chance that I may need to develop this program outside of Qt. (I'm currently just using Creator as my IDE; not actually taking advantage of any Qt stuff yet.)
I found the compiler option "-m32" which will do what I want, but...from what I've read earlier in this thread, I don't think this will work, because my build of Qt only contains libraries for 64-bit code, right?
I'm trying to do this the "right" way. My code (though not necessarily the make information) will also have to run on a Windows OS eventually. What is your recommendation for the best way to tackle this issue?
Oh: and if I did want to use that compiler option, where do I put that? I can't find a place in the preferences to put that.
Thanks again for all the help.
I never used the "-m32" option, so I cannot comment with proof on that. According to the docs, it generates 32bit code - and that would not link against the 64 bit Qt libs.
That compiler option would have to be placed into
Although, I would recommend the CONFIG and arch settings. I'm not sure if you can build fat binaries using -m32 at all.
If you cannot rely on the Qt typedefs, then int32_t seems to be a good solution.
OK...those flags you reference above -- they go in the .pro file, right? As would the CONFIG setting?
And, if I'm following this thread correctly, the arch setting is only useful when I'm building my own binaries, since the default binary won't support 32-bit, right?
Yep, everything qmake related goes into the .pro.
Regarding the 32bit switch, yep - you need you own Qt build to support this.