我们正在为项目使用GCC预编译头文件,并按照以下方式构建它们:
gcc $(CFLAGS) precompiledcommonlib.h
现在我正在OSX 10.6上构建项目,并尝试同时使用为所有体系结构构建的漂亮功能:
gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c
但是,这似乎不适用于预编译的标头:
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)
编辑: 正如Mark根据XCode指出的那样,必须为每个体系结构单独构建预编译头,所以我的问题是,如果有任何方法让gcc在构建通用对象时使用正确的预编译头。
我确实意识到我可以像XCode一样完全分离每个架构,但我更愿意利用同时构建它们的可能性,而不必使用不同的构建配置。
答案 0 :(得分:4)
您的问题不是架构。两者都失败了
问题是您正在尝试构建没有主函数的可执行文件。
由于文件名是commonlib.c,我怀疑你想构建一个库,如果是这样的话,用XCode中的库模板启动项目。
答案 1 :(得分:3)
我刚刚遇到了同样的问题并跟进了@lucas提供的链接,所以我想我会提供我在这里找到的内容。
首先请注意,如果您将gcc代码从Linux移植到MacOS,那么apple提供的gcc版本无法正确检测.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
正如另一个答案中所提到的,最好指定-x
参数以确保gcc知道您正在编译的文件类型。
g++ -x c++-header test.hpp
这会创建预期的test.hpp.gch
。
您可以在命令行上指定任何体系结构,并正确构建gch
g++ -x c++-header test.hpp -arch i386
或
g++ -x c++-header test.hpp -arch x86_64
如果您提供多个架构,则会收到海报上提到的错误。
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)
关键是要分别编译您需要的体系结构,然后使用-Xarch_
参数在编译期间加载适当的体系结构:
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
答案 2 :(得分:-1)
这可能对您有用
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)