在Mac上构建gcc时遇到问题-无法找到系统标题

时间:2018-09-06 20:02:20

标签: macos gcc

我在运行OS-X High Sierra的Mac上,想创建一个单独的gcc版本。 Lemme分享了我花了一周时间才能完成的工作,因此对其他人有帮助。

我创建了一个安全目录“ gcc”,并使用svn从gcc获取了最新的源代码,它是在名为“ trunk”的子目录中创建的。我最初在主干的顶层创建了一个名为“ build”的目录。

没有这四个依赖项就无法编译,因此我运行./contrib/download先决条件来获取它们,但仍然无法编译,因此我分别进入了这四个目录并进行了./configure, ./make、./make安装和./make检查。我做了安装部分是因为即使这些依赖项也相互依赖,所以安装似乎是确保可以找到它们的一种安全方法。后来我发现没有其他方法,尽管有相反的指示...

我成功构建了依赖项GMP,MPFR,ISL和MPC。然后我回到./build,然后../configure成功,但是构建(make)很快失败,提示“已经配置了源目录;首先运行“ make distclean”。谷歌搜索显示这是在源目录中进行配置的我以为我的trunk / build目录可能被认为是“在源目录中”,所以我将其移动并再次尝试,发生了同样的事情。当我尝试进入trunk并键入“ make distclean”时,只是说没有规则将目标设为distclean。

所以我想,也许是4个依赖项目录?也许现在已经安装了它们,可以安全地清除它们了吗?在那里,使distclean正常工作并删除了所有内容-包括我进行的测试。看起来很浪费,并且需要预先安装它们,但确实行得通。

回到构建中,make随后在make期间开始进行一些认真的编译工作,但是崩溃了,并说“应该包含系统头的目录不存在:/ usr / include”。

我应该如何引导?我在哪里可以找到要复制到/ usr / include的系统头文件?以后缺少libc和库是否会有同样的问题?另外,如果我希望将此文件移植到新计算机上而不进行重建,那么除了可执行文件和头文件外,我还需要复制什么?我该把它们放在哪里?

感谢您的任何建议... -杰夫

3 个答案:

答案 0 :(得分:1)

我设法通过Xcode 8.3.3在macOS Sierra上构建了GCC。在您的系统上尝试以下操作。 (如果您具有更新的macOS版本或Xcode的更新版本,则可能需要进行一些调整。)

先决条件

  • macOS Sierra 10.12.6
  • Xcode 8.3.3

详细信息:

$ xcode-select -p
/Users/strager/Applications/Xcode_8.3.3.app/Contents/Developer

$ clang --version                     
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Users/strager/Applications/Xcode_8.3.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ as --version
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Users/strager/Applications/Xcode_8.3.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ ld -v
@(#)PROGRAM:ld  PROJECT:ld64-278.4
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
LTO support using: LLVM version 8.1.0, (clang-802.0.42)
TAPI support using: Apple TAPI version 1.33.11

配置和构建

$ # Download GCC's source code.
$ git clone git://gcc.gnu.org/git/gcc.git gcc
$ # I tested the following revision (SVN r278004 from November 9, 2019):
$ (cd gcc && git checkout a9ad50cb8ec15c509d27c1dbd47b76f56d20fb3b)
$ # Download GCC's uncommon dependencies.
$ ./contrib/download_prerequisites
$ # Apply a build fix: https://gcc.gnu.org/ml/gcc-patches/2019-11/msg01109.html
$ patch -p1 <<<EOF
diff --git a/libstdc++-v3/include/bits/alloc_traits.h
b/libstdc++-v3/include/bits/alloc_traits.h
index 55211ac1d72..6ad02df16f7 100644
--- a/libstdc++-v3/include/bits/alloc_traits.h
+++ b/libstdc++-v3/include/bits/alloc_traits.h
@@ -566,7 +566,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif

   template<typename _Alloc>
-    _GLIBCXX14_CONSTEXPR void
+    _GLIBCXX14_CONSTEXPR inline void
     __alloc_on_copy(_Alloc& __one, const _Alloc& __two)
     {
       typedef allocator_traits<_Alloc> __traits;
@@ -580,7 +580,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }

   template<typename _Alloc>
-    constexpr _Alloc
+    constexpr inline _Alloc
     __alloc_on_copy(const _Alloc& __a)
     {
       typedef allocator_traits<_Alloc> __traits;
@@ -598,7 +598,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif

   template<typename _Alloc>
-    _GLIBCXX14_CONSTEXPR void
+    _GLIBCXX14_CONSTEXPR inline void
     __alloc_on_move(_Alloc& __one, _Alloc& __two)
     {
       typedef allocator_traits<_Alloc> __traits;
@@ -625,7 +625,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif

   template<typename _Alloc>
-    _GLIBCXX14_CONSTEXPR void
+    _GLIBCXX14_CONSTEXPR inline void
     __alloc_on_swap(_Alloc& __one, _Alloc& __two)
     {
       typedef allocator_traits<_Alloc> __traits;
EOF

$ # Configure a build directory for a 3-stage build.
$ mkdir gcc-build-release
$ cd gcc-build-release
$ ../gcc/configure \
    --disable-werror \
    --enable-checking=release \
    --enable-languages=c,c++ \
    --prefix="${PWD}/../usr" \
    --with-native-system-header-dir=/Users/strager/Applications/Xcode_8.3.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ \
    --disable-multilib

$ # Build.
$ flags='-mmacosx-version-min=10.12 -Wa,-mmacosx-version-min=10.5 -iframework /Users/strager/Applications/Xcode_8.3.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/' ; \
    make -w -j9 BOOT_CFLAGS="${flags}" CFLAGS_FOR_TARGET="${flags}" CXXFLAGS_FOR_TARGET="${flags}"

问题排查

问题:构建失败:

  

应包含系统头的目录不存在:/ usr / include

原因:GCC的配置脚本默认为--with-native-system-header-dir=/usr/include。那个导演不存在。

解决方案:使用--with-native-system-header-dir=/Users/strager/Applications/Xcode_8.3.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/进行配置。


问题:链接或配置失败:

  

检查C编译器是否工作...否
  配置:错误:在`/Users/strager/tmp/Projects/gcc/build-release/x86_64-apple-darwin16.7.0/libgomp'中:
  配置:错误:C编译器无法创建可执行文件
  config.log显示:ld:-lcrt1.10.6.o找不到库

或以下任何一项:

  

ld:-ldylib1.o找不到库
  ld:找不到-ldylib1.10.5.o的库

原因:赋予链接器驱动程序的-mmacosx-version-min=值与Xcode中的SDK不匹配。 GCC tries to link the wrong objects

解决方案:使用-mmacosx-version-min=10.12MacOSX10.12.sdkBOOT_CFLAGS(对于Xcode 8.3.3的CFLAGS_FOR_TARGET)构建阶段2和3。 CXXFLAGS_FOR_TARGET进行变量。


问题:libstdc ++。6.dylib无法链接:

  

0 0x1059a453b __assert_rtn + 129
  1 0x1059a940a mach_o ::可重定位:: CUSection :: personalityName(mach_o ::可重定位:: Parser&,macho_relocation_info> const *)+ 170
  2 0x1059b8c2e mach_o ::可重定位:: CUSection :: parse(mach_o ::可重定位:: Parser&,unsigned int,mach_o ::可重定位:: CUSection :: Info *)+ 306
  3 0x1059b666b mach_o ::可重定位::解析器::解析(mach_o ::可重定位:: ParserOptions const&)+ 695
  4 0x1059af1c9 mach_o :: relocatable :: Parser :: parse(unsigned char const *,unsigned long long,char const *,long,ld :: File :: Ordinal,mach_o :: relocatable :: ParserOptions const&)+ 261
  5 0x1059d9758存档:: File :: makeObjectFileForMember(archive :: File :: Entry const *)const + 748
  6 0x1059d8b8c存档:: File :: forEachAtom(ld :: File :: AtomHandler&)const + 238
  7 0x1059f2955 ld :: tool :: InputFiles :: forEachInitialAtom(ld :: File :: AtomHandler&,ld :: Internal&)+ 533
  8 0x1059fe49c ld :: tool :: Resolver :: resolve()+ 44
  9 0x1059a5289主+ 725
  在以下位置创建了链接器快照:
          /tmp/libstdc++.6.dylib-2019-10-13-002048.ld-snapshot
  ld:声明失败:(((parser.sectionForAddress(personalityAddr)-> type()== ld :: Section :: typeCode)&&“ __compact_unwind节中的个性列不是指向函数的指针”),函数personalityName,文件/ Library / Caches / com.apple.xbs / Sources / ld64 / ld64-278.4 / src / ld / parsers / macho_relocatable_file.cpp,第5128行。
  collect2:错误:ld返回1退出状态

原因LLVM's assembler (as) generates __compact_unwind sections。尽管有GCC linking with -no_compact_unwind,ld64仍会验证__compact_unwind部分。数据格式不正确(原因未知),因此链接器会抱怨。

解决方案:告诉汇编器不要使用__compact_unwind-Wa,-mmacos-version-min=10.5BOOT_CFLAGS为阶段2和3生成CFLAGS_FOR_TARGETCXXFLAGS_FOR_TARGET进行变量。


问题:libstdc ++。6.dylib无法链接:

  

x86_64体系结构的未定义符号:
    “ __ZSt15__alloc_on_copyISaIcEEvRT_RKS1_”,引用自:         libstdc ++。a(string-inst.o)中的__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_
    “ __ZSt15__alloc_on_moveISaIcEEvRT_S2_”,引用自:         libstdc ++。a(string-inst.o)中的__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEOS4_
    “ __ZSt15__alloc_on_swapISaIcEEvRT_S2_”,引用自:         libstdc ++。a(string-inst.o)中的__ZN9__gnu_cxx14__alloc_traitsISaIcEcE10_S_on_swapERS1_S3_
  ld:找不到架构x86_64的符号
  collect2:错误:ld返回1退出状态

原因-fno-implicit-templates导致即使需要这些符号也不会创建。

解决方案Mark function templates inline


问题:ASAN(libsanitizer)无法编译:

  

在../../../../gcc/libsanitizer/asan/asan_malloc_mac.cpp:64中包含的文件中:
  ../../../../gcc/libsanitizer/sanitizer_common/sanitizer_malloc_mac.inc:20:10:致命错误:CoreFoundation / CFBase.h:没有此类文件或目录
     20 | #include

原因:没有告知GCC Xcode SDK中CoreFoundation的位置。

解决方案:使用-iframework ....sdk/System/Library/FrameworksBOOT_CFLAGSCFLAGS_FOR_TARGET创建变量,并使用CXXFLAGS_FOR_TARGET构建阶段2和3。

答案 1 :(得分:0)

好的,我上面提到的任何东西都没有起作用-没有gcc构建标记起作用。但是我最终用一种简单的方式修复了我的系统:问题是您需要用gcc来制作gcc,而我什至不能做brew install gcc-它会与损坏的C ++库一起崩溃。

但是后来我意识到XCode附带了一个安全的,完全自包含的clang / llvm工具链-实际上就像拥有一个docker。为了找到将所有内容准确放置在何处,我使用了xcodebuild -find命令(带有make,gcc,clang等)。我发现gcc需要构建的所有东西都在这里:

export PATH = /应用程序/Xcode.app/Contents/Developer/usr/bin:$PATH

一旦进入我的道路,make就会去那里并使用XCode的gcc,它足够新,可以构建或安装现代gcc,所以我可以这样做:

重新安装gcc

而且,通过天哪,我终于有了功能齐全的gcc工具链。 Brew将其放在/ usr / local / bin等中。

那比我以前想象的要难。由于您需要使用gcc来制作gcc,它是如何诞生的? ;)

答案 2 :(得分:0)

Paul Silisteanu写了一篇很棒的博客文章,详细描述了该过程:Compiling GCC 9 on macOS Mojave

简称为:

1)macOS 10.14 Mojave移动了系统头文件,这是从源代码构建GCC棘手的原因之一。但是,Apple提供了一个安装程序来替换它们。

cd /Library/Developer/CommandLineTools/Packages/
open .

这将在Finder中打开一个窗口,安装软件包。请注意,不能保证将来的操作系统更新中都包含该功能。

2)建立依赖关系:

每一个都很简单,不需要特别的操作(但要按此顺序安装)。

3)博客文章建议使用此配置(假定版本9.1)。您可以将依赖项放在其他位置,只需指定位置即可。

mkdir build && cd build
../configure --prefix=/usr/local/gcc-9.1 \
             --enable-checking=release \
             --with-gmp=/usr/local/gcc-9.1 \
             --with-mpfr=/usr/local/gcc-9.1 \
             --with-mpc=/usr/local/gcc-9.1 \
             --enable-languages=c,c++,fortran \
             --with-isl=/usr/local/gcc-9.1 \
             --program-suffix=-9.1

程序后缀是可选的,但是对于“特殊情况”的此编译器来说很不错,以免将其与clang混淆。

这些是有经验的用户的简要说明;请参阅博客文章,以获取更详细和指导的导览。