在OSX上预编译的头文件和编译通用对象

时间:2009-11-18 17:05:02

标签: macos gcc x86-64 precompiled-headers

我们正在为项目使用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一样完全分离每个架构,但我更愿意利用同时构建它们的可能性,而不必使用不同的构建配置。

3 个答案:

答案 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)