Cabeçalhos pré -compilados e compilação universais no OSX
-
20-09-2019 - |
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.
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)