我在运行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和库是否会有同样的问题?另外,如果我希望将此文件移植到新计算机上而不进行重建,那么除了可执行文件和头文件外,我还需要复制什么?我该把它们放在哪里?
感谢您的任何建议... -杰夫
答案 0 :(得分:1)
我设法通过Xcode 8.3.3在macOS Sierra上构建了GCC。在您的系统上尝试以下操作。 (如果您具有更新的macOS版本或Xcode的更新版本,则可能需要进行一些调整。)
详细信息:
$ 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.12
,MacOSX10.12.sdk
和BOOT_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.5
和BOOT_CFLAGS
为阶段2和3生成CFLAGS_FOR_TARGET
节CXXFLAGS_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/Frameworks
,BOOT_CFLAGS
和CFLAGS_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混淆。
这些是有经验的用户的简要说明;请参阅博客文章,以获取更详细和指导的导览。