Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX上的预编译头和编译通用对象_Macos_Gcc_X86 64_Precompiled Headers - Fatal编程技术网

Macos OSX上的预编译头和编译通用对象

Macos OSX上的预编译头和编译通用对象,macos,gcc,x86-64,precompiled-headers,Macos,Gcc,X86 64,Precompiled Headers,我们在项目中使用GCC的预编译头,并按照如下方式构建它们: gcc $(CFLAGS) precompiledcommonlib.h gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c 现在,我正在OSX 10.6上构建该项目,并尝试使用同时构建所有体系结构的漂亮功能,如下所示: gcc $(CFLAGS) precompiledcommonlib.h gcc $(CFLAGS) -c -arch i386 -arch x86_64

我们在项目中使用GCC的预编译头,并按照如下方式构建它们:

gcc $(CFLAGS) precompiledcommonlib.h
gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c  
现在,我正在OSX 10.6上构建该项目,并尝试使用同时构建所有体系结构的漂亮功能,如下所示:

gcc $(CFLAGS) precompiledcommonlib.h
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那样完全独立地构建每个体系结构,但我更愿意利用这种可能性,同时构建它们,而不必混淆不同的构建配置。

您的问题不在于体系结构。两者都在失败

问题是您试图构建一个没有主函数的可执行文件


由于文件名是commonlib.c,我怀疑您想构建一个库,如果是这样的话,请使用XCode中的库模板启动项目。

我遇到了相同的问题,并使用@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

如果您提供了多个体系结构,则会出现海报中提到的错误

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\uu
参数加载相应的体系结构:

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

这可能对你有用

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)

谢谢你花时间。试试“gcc foo.h”。它输出什么?你还认为我在试图构建一个可执行文件吗?一个仓促的,更不用说明显错误的回答和一个傲慢的态度并不是一个特别迷人的组合。对不起,我把命令行弄错了。但是,错误消息和命令行正在尝试构建可执行文件。-这就是为什么ld是命令行,通过给出错误,我仍然会在Xcode中设置它以获得正确的所有标志。如果有,您会认为Apple会为每个架构分别预编译每个头,并且命令行包括-x objective-c-header-arch x86\u 64。Apple文档还建议使用-x参数。amd详细介绍了不同的架构。很好。当我在没有main方法的情况下构建一个项目时,我遇到了这个错误。我只是尝试做同样的事情,从我收集到的信息来看,当给苹果的GCC两个
-arch
标志时,你不能生成一个PCH文件。Qt的人似乎在做一些奇怪的事情来让它工作,你可能想看看它。。。很好的发现!谢谢!