Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compile universal libraries on Mac OS X?

This may be a very silly question, but I'm new to developing on Macs and am having a hard time with the universal binaries.

I've got an application that I'm compiling in QT Creator, which according to lipo is producing i386 architecture outputs. As I understand it, that means it is producing Mac OS X 32 bit outputs.

The application depends on two external libraries. One of these libraries I'm compiling by calling ./config first, and then make. ./config states that it is "Configured for darwin-i386-cc". However, after running make, and calling lipo on the result, the architecture is reported as x86_64.

Similarly, I have another external library. That one has no configure script, and I compile it simply by calling make. The output from this one too is x86_64.

How can I compile these two external libraries so that they produce something compatible with my application's i386 output? Better yet, how can I compile these two external libraries to produce universal libraries so I can produce a universal binary from my application that works on both 32 and 64 bit?

Also, based on the current state of the Mac world, are there any other platforms that I should be expected to target to create a proper, user-friendly Mac OS X universal binary?

like image 391
Nantucket Avatar asked Jul 28 '10 05:07

Nantucket


People also ask

Does macOS have a compiler?

OS X ships two compilers and their corresponding toolchains. The default compiler is based on GCC 4.2. In addition, a compiler based on GCC 4.0 is provided. Older versions of Xcode also provide prior versions.

What compiler does Mac use?

Clang is a compiler created by Apple written over the LLVM compiler. It can be used to compile C, C++, Objective C/C++, OpenCL, CUDA, and RenderScript. Command-line developer tools install clang. Once command-line tools are installed, clang --version can be used to check if clang is installed.

What is a macOS binary?

MacBinary is a file format that combines the two forks of a classic Mac OS file into a single file, along with HFS's extended metadata.

What is the difference between Apple silicon and universal?

An "Apple Silicon" application will only contain code built for AArch64, an "Intel" one will only run under x86_64, and a "Universal" app will contain code for both of them. As you see, both Firefox and the system-provided ls have both been built and shipped as fat binaries.


1 Answers

Finally got it working.

In order to control the architecture of the target, I manually went in and edited the Makefiles.

For one of them, I added to the end of the line that starts with CFLAGS: -arch i386 -arch x86_64 -arch ppc This produced a universal binary.

For the other, when I did the same thing, the compile would error out. I had to cycle through and only put one arch at a time, and then after I produced all three, I called lipo on them with the -create flag to create a universal binary.

like image 85
Nantucket Avatar answered Oct 05 '22 22:10

Nantucket