Pregunta

Estamos utilizando encabezados precompilados con GCC para nuestro proyecto y construya como esto:

gcc $(CFLAGS) precompiledcommonlib.h

Ahora estoy construyendo el proyecto en OSX 10.6 y tratando de utilizar la buena característica de la construcción para todas las arquitecturas, al mismo tiempo como esto:

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

Sin embargo, parece que esto no funciona para los encabezados precompilados:

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)

Editar: Como Mark señaló según XCode el encabezado precompilado tiene que ser construido por separado para cada arquitectura, por lo que mi pregunta es más bien si hay alguna manera de tener gcc utilizar el encabezado precompilado derecha en la construcción de objetos universales.

Me doy cuenta de que podía construir cada arquitectura separar por completo como XCode hace pero yo preferiría tomar ventaja de la posibilidad de construir al mismo tiempo y no tener que perder el tiempo con diferentes configuraciones de construcción.

¿Fue útil?

Solución

Me acabo de encontrar con las mismas preguntas y seguido con el enlace proporcionado por @lucas, por lo que pensé que iba a dar lo que he encontrado aquí.

En primer nota, si está portando su código gcc de Linux a Mac OS, la versión de gcc proporcionado por Apple no detecta correctamente la extensión de archivo .hpp.

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

Como se ha mencionado en otra respuesta, lo mejor es especificar el argumento -x para asegurarse de gcc sabe qué tipo de archivo que está compilando.

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

Esto crea la test.hpp.gch esperado.

Puede especificar cualquier arquitectura en la línea de comandos y la GCH construye correctamente

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

o

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

Si proporciona más de una arquitectura, se obtiene el error del cartel mencionado.

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)

La clave es compilar las arquitecturas que necesita por separado a continuación, utilizar el argumento -Xarch_ para cargar el apropiado durante la compilación:

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

Otros consejos

Su problema no son las arquitecturas. Ambos están fallando

El problema es que usted está tratando de construir un ejecutable sin función principal.

Como el nombre del archivo es commonlib.c Sospecho que desea construir una biblioteca de ser así iniciar el proyecto con una plantilla de biblioteca en XCode.

Esto podría funcionar para usted

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top