Pergunta

Estamos usando cabeçalhos pré -compilados com o GCC para o nosso projeto e construí -los assim:

gcc $(CFLAGS) precompiledcommonlib.h

Agora estou construindo o projeto no OSX 10.6 e tentando usar o recurso bacana da construção de todas as arquiteturas ao mesmo tempo como esta:

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

No entanto, parece que isso não funciona para os cabeçalhos pré -compilados:

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: Como Mark apontou conforme Xcode, o cabeçalho pré -compilado deve ser construído separadamente para cada arquitetura, portanto, minha pergunta é se houver alguma maneira de fazer com que o GCC use o cabeçalho direito pré -compilado ao criar objetos universais.

Percebo que poderia construir cada arquitetura completamente separada, como o Xcode faz isso, mas prefiro tirar proveito da possibilidade de construí -los ao mesmo tempo e não ter que mexer com diferentes configurações de construção.

Foi útil?

Solução

Acabei de encontrar as mesmas perguntas e acompanhar o link fornecido pela @lucas, então pensei em fornecer o que encontrei aqui.

Primeiro digno de nota, se você estiver portando seu código GCC do Linux para o MacOS, a versão do GCC fornecida pela Apple não detecta corretamente a extensão do arquivo .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 mencionado em outra resposta, é melhor especificar o -x Argumento para garantir que o GCC saiba que tipo de arquivo você está compilando.

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

Isso cria o esperado test.hpp.gch.

Você pode especificar qualquer arquitetura na linha de comando e o GCH constrói corretamente

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

ou

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

Se você fornecer mais de uma arquitetura, receberá o erro mencionado pelo pôster.

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)

A chave é compilar as arquiteturas de que você precisa separadamente e usar o -Xarch_ Argumento para carregar o apropriado durante a compilação:

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

Outras dicas

Seu problema não são as arquiteturas. Ambos estão falhando

A questão é que você está tentando criar um executável sem uma função principal.

Como o nome do arquivo é Commonlib.c, suspeito que você queira criar uma biblioteca, se assim for, inicie o projeto com um modelo de biblioteca no Xcode.

Isso pode funcionar para você

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top