Question

We are using precompiled headers with GCC for our project and build them like this:

gcc $(CFLAGS) precompiledcommonlib.h

Now I'm building the project on OSX 10.6 and trying to use the nifty feature of building for all architectures at the same time like this:

gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c  

However, it seems this does not work for the precompiled headers:

gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h
Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
lipo: can't open input file: /var/folders/z1/z1A0sPkqGDyPrZWo9ysVK++++TI/-Tmp-//cc3W2gwd.out (No such file or directory)

Edit: As Mark pointed out as per XCode the precompiled header has to be built separately for each architecture, so my question is rather if there is any way to have gcc use the right precompiled header when building universal objects.

I do realise that I could build each architecture completely separate like XCode does it but I would much rather take advantage of the possibility to build them at the same time and not have to mess around with different build configurations.

Was it helpful?

Solution

I just ran into the same questions and followed up with the link provided by @lucas, so I thought I would provide what I found here.

First of note, if you are porting your gcc code from Linux to MacOS, the version of gcc provided by apple does not properly detect .hpp file extension.

mac:openstudio lefticus$ g++ test.hpp
ld: warning: ignoring file test.hpp, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

As mentioned in another answer, it's best to specify the -x argument to make sure gcc knows what type of file you are compiling.

g++ -x c++-header test.hpp

This creates the expected test.hpp.gch.

You can specify any architecture on the command line and the gch builds properly

g++ -x c++-header test.hpp -arch i386

or

g++ -x c++-header test.hpp -arch x86_64

If you provide more than one architecture, you get the error the poster mentioned.

mac:openstudio lefticus$ g++ -xc++-header test.hpp -arch i386 -arch x86_64
Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
lipo: can't open input file: /var/folders/DM/DMTpbjzHHX08IEqGgEAORE+++TI/-Tmp-//ccDeWigf.out (No such file or directory)

The key is to compile the architectures you need separately then use the -Xarch_ argument to load the appropriate one during compilation:

g++ -x c++-header -arch x86_64 x86_64/test.hpp
g++ -x c++-header -arch i386 i386/test.hpp

g++ -arch i386 -arch x86_64 test.cpp -Xarch_i386 -Ii386 -Xarch_x86_64 -Ix86_64

OTHER TIPS

Your problem is not the architectures. Both are failing

The issue is that you are trying to build a executable without a main function.

As the file name is commonlib.c I suspect you want to build a library if so start the project with a library template in XCode.

This might work for you

valid output formats for -f are (`*' denotes default):
  * bin       flat-form binary files (e.g. DOS .COM, .SYS)
    ith       Intel hex
    srec      Motorola S-records
    aout      Linux a.out object files
    aoutb     NetBSD/FreeBSD a.out object files
    coff      COFF (i386) object files (e.g. DJGPP for DOS)
    elf32     ELF32 (i386) object files (e.g. Linux)
    elf64     ELF64 (x86_64) object files (e.g. Linux)
    elfx32    ELFX32 (x86_64) object files (e.g. Linux)
    as86      Linux as86 (bin86 version 0.3) object files
    obj       MS-DOS 16-bit/32-bit OMF object files
    win32     Microsoft Win32 (i386) object files
    win64     Microsoft Win64 (x86-64) object files
    rdf       Relocatable Dynamic Object File Format v2.0
    ieee      IEEE-695 (LADsoft variant) object file format
    macho32   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
    macho64   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
    dbg       Trace of all info passed to output stage
    elf       ELF (short name for ELF32)
    macho     MACHO (short name for MACHO32)
    win       WIN (short name for WIN32)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top