Fedora 21 带 clang,不带 gcc

2024-05-07

你能(合理地)让 Fedora 21 变得只有 llvm/clang/libc++/libc++abi 吗? (我发现有些东西暗示不可以,但它们都已经有 3 岁了,从那时起 llvm/clang 已经取得了长足的进步。)

通过全新安装,我尝试了

yum install gcc gcc-c++
(downloaded, built, installed llvm/cfe(clang)/compiler-rt/libcxx/libcxxabi from svn)
yum remove gcc gcc-c++
added to /etc/profile: export CC=/usr/local/bin/clang \ export CXX=/usr/local/bin/clang++
(in case of hard wiring)
ln -s /usr/local/bin/clang /usr/local/bin/gcc
ln -s /usr/local/bin/clang /usr/local/bin/cc
ln -s /usr/local/bin/clang++ /usr/local/bin/g++
ln -s /usr/local/bin/clang++ /usr/local/bin/c++
ldconfig

我很高兴,然后去构建一些东西,然后我得到了:

ld: cannot find crtbegin.o
ld: cannot find -lgcc
ld: cannot find -lgcc_s

clang -v 包括

Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/4.9.2

ldconfig && ldconfig -p | ldconfig grep libgcc 确实显示

libgcc_s.so.1 (libc6,x86-64) => /lib64/libgcc_s.so.1

/lib64 是 /usr/lib64 的符号链接。并且, /usr/lib64/libgcc_s.so.1 是 /usr/lib64/libgcc_s-4.9.2-20150212.so.1 的符号链接,它作为真实文件存在(92816 字节)。

所以,我不明白 ld 的问题出在 -lgcc_s 上。找不到 crtbegin,也找不到 gcc (no _s)。

yum install libgcc 表示它已经安装并且是最新版本,无需执行任何操作。

由于我已经安装了 clang 源构建,我可以重新构建 clang (这次使用 clang 而不是 gcc)来摆脱依赖性吗? (也许“候选 GCC 安装”位就会消失。)

我可以强制将 -stdlib=c++ 和 -lc++abi 设置为默认值,或者至少在没有 gcc 的情况下安装 libc++ 和 libc++abi 吗?


花了一些时间尝试让 clang 在没有 GCC 的情况下与 libc++ 和 libc++abi 一起工作,我发现这确实是可能的,即使考虑到 LLVM/clang 的当前状态有点问题。除了小型测试程序之外,我还能够在未安装 GCC 的情况下构建 CMake 和其他一些用 C++ 编写的软件包,并且生成的二进制文件独立于 libstdc++;根据 ldd 输出,它们仅依赖于 libc++/libc++abi。不幸的是,我无法使用使用 GCC 构建的 clang 来构建 clang 本身。我一直在不同的 Linux 平台上进行实验(Fedora 21 32 位、Amazon Linux 版本 2015.3(基于 RPM)64 位、CentOS 7.1 64 位和 Ubuntu 14.04 64 位)。

尽管可以使用 libc++/libc++abi 通过 clang 构建软件,而不依赖于 libstdc++ 并且不存在 GCC 编译器,但典型的 Linux 安装与 libgcc 和 libstdc++ 紧密相关,以至于摆脱它们是不切实际的。尝试删除这两个包,您将看到系统有多少依赖于它们。即使在 FreeBSD 10.1 上,clang 是默认编译器且未安装 GCC,在构建程序时也会使用 libgcc.a、libgcc_s.so 和一些 crt*.o 文件,如 -v 选项所示。另外,在 FreeBSD 10.1 上,根据 ldd,生成的二进制文件依赖于 libgcc。在 Ubuntu 上,它使用 dpkg 作为包管理器,这些文件

   libgcc.a
   libgcc_s.so
   crtbegin.o
   crtbeginT.o
   crtbeginS.o
   crtendS.o
   crtend.o

位于 libgcc-devel 软件包中,而在基于 RPM 的系统(例如 Fedora)上,它们位于 gcc 软件包中。此外,您可能需要这些文件,即使我尝试构建的代码不需要它们:

   crtfastmath.o
   crtprec32.o
   crtprec80.o
   crtprec64.o

因此,有人可能会争辩说,上述文件最好属于 libgcc,而不是 gcc。据我所知,在删除 gcc 软件包之前,需要在基于 RPM 的系统上完成以下操作:

1)创建符号链接

libgcc_s.so -> libgcc_s.so.1

在 libgcc_s.so.1 所在的任何目录中。

2) 将上面列出的 crt*.o 文件复制到该目录。

3) 在同一目录中创建符号链接(libstdc++.so.x 应该已经存在;x 是一个数字):

libstdc++.so -> libstdc++.so.x

仅当您要使用 libstdc++ 时才需要这个;如果您只打算使用 libc++,则不需要这样做。一些 系统 libstdc++.so 是属于 libstdc++ 软件包的 libstdc++.so.x 的符号链接,由 libstdc++-devel 软件包放置到 GCC 库目录中,因此您可以在卸载 GCC 后删除该目录,然后在中创建符号链接libstdc++.so.x 所在的同一目录。

现在您应该能够执行以下操作:

1)构建C程序:

clang progname.c

2) 使用 libstdc++ 头文件/库构建 C++ 程序:

clang++ -I<location of headers> progname.cpp

在我看过的基于 RPM 的系统上,libstdc++ 标头是 libstdc++-devel 包的一部分,可以从包上的 rpm -ql 找到它们的位置。

3) 使用 libc++ 头文件/库构建 C++ 程序:

clang++ -I/<location of headers> progname.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc -lgcc_s

标头的位置是您构建 LLVM+clang 等时安装的位置。

请参见http://libcxx.llvm.org/ http://libcxx.llvm.org/获取更多信息。当使用 libc++/libc++abi 构建 C++ 代码时,您可以使用 -stdlib=libc++ 而不是 -I 标志,但在我的测试中,它仅适用于从源代码构建的 clang,不适用于从存储库安装的 clang(您可以安装从 repo 中下载 clang 并使用它来构建 libc++/libc++abi;或者您可以使用 gcc 来构建 libc++(abi),然后删除 gcc 并将库与 repo 提供的 clang 一起使用)。

当配置软件包以使用 clang + libc++ 构建它时,您可能需要设置以下内容:

LIBS="-nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc"
CXX=clang++
CXXFLAGS="-stdlib=libc++"
CC=clang

请注意,要配置 CMake 源以构建它,我必须使用如下包装脚本:

#!/bin/bash

MYLFLAGS="-nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc"

# Catch the case when we only want to compile; this helps us avoid some warnings:
if echo "$@" | egrep "(^-c | -c | -c$)" >/dev/null 2>&1; then
MYLFLAGS=""
fi

/usr/local/bin/clang++ -stdlib=libc++ "$@" $MYLFLAGS

它也可能对其他目的有用。

欲了解更多信息,请参阅我的文章:http://www.omniprog.info/clang_no_gcc.html http://www.omniprog.info/clang_no_gcc.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fedora 21 带 clang,不带 gcc 的相关文章

随机推荐

  • 相当于 DB2 的 LIMIT

    你好吗LIMIT在 iSeries 版 DB2 中 我有一个包含超过 50 000 条记录的表 我想返回 0 到 10 000 条记录 以及 10 000 到 20 000 条记录 我知道你用 SQL 写的LIMIT 0 10000在 0
  • 如何在动态创建的一组 editText 上设置 onFocusChangeListener()?

    我有这段代码 每次前一个 lineaLayout 的 edittext 失去焦点时 我都会膨胀一个包含 3 个 editText 的 LinearLayout 我只想在最近创建的 editTexts 上使用 onFocusChangeLis
  • java中如何查找两个时间戳的差异?

    我有一个ArrayList包括多个时间戳 目的是找到第一个和最后一个元素的差异ArrayList String a ArrayList get 0 String b ArrayList get ArrayList size 1 long d
  • 具有最小长度的 TypeScript 数组

    如何在 TypeScript 中创建只接受具有两个或更多元素的数组的类型 needsTwoOrMore onlyOne should have error needsTwoOrMore one two should be allowed n
  • 使用 IntelliJ 的 Cucumber 找不到步骤定义

    我遇到了以下问题 我在 IntelliJ 中有四个 Cucumber 功能文件 我通过 IntelliJ 插件添加了 Cucumber 支持 创建功能后 我按如下方式编辑了配置 以便可以执行功能文件 Glue should be the n
  • 如何将 tkinter 窗口放在其他窗口之上?

    我正在使用 Python 2Tkinter and PyObjC 然后我用py2app 该程序工作正常 但每当我打开该程序时 该窗口都会以隐藏状态开始 因此直到我单击扩展坞上的图标将其调出时 它才会出现 有什么方法可以控制这个 使窗口位于应
  • 相当于 Rcpp 中的 'which' 函数

    我是 C 和 Rcpp 的新手 假设我有一个向量 t1 lt c 1 2 NA NA 3 4 1 NA 5 我想获得 t1 的元素索引NA 我可以写 NumericVector retIdxNA NumericVector x Step 1
  • Redhat Vim 中的可视化块插入

    我的 ec2 服务器附带了 redhat vim ec2 user vim version VIM Vi IMproved 7 2 2008 Aug 9 compiled Jul 7 2012 08 03 48 Included patch
  • 在 Java 中加载和缓存图像的最佳方法是什么?

    我有超过一千个 16 x 16 像素图块图像的大量集合 我在 Java 中制作的游戏需要这些图像 在不耗尽 JVM 可用内存的情况下存储切片的最佳方法是什么 我认为生成 1000 BufferedImages 可能并不明智 保持图像准备就绪
  • 如何默认显示带有手动(键盘)输入的时间选择器对话框?

    时间选择器对话框默认显示循环计时以选择日期和时间 相反 它需要默认显示键盘输入来选择日期和时间 在以圆形样式显示时间选择器对话框时 它具有键盘图标 可将圆形样式更改为手动输入样式 Android Oreo 操作系统设备可使用此功能 如何在支
  • 如何使用高复制数据存储

    好的 我已经看过了video http www google com events io 2011 sessions more 9s please under the covers of the high replication datas
  • 在Fragment中第一次调用时SharedPreferences为空

    我有一个示例 Android 应用程序 根据位置 邮政编码 和设置 SharedPreference 中设置的温度单位 该应用程序显示 7 天的天气 当应用程序第一次获取温度并检查 SharedPreference 中设置的温度单位时 它似
  • 适用于 iOS 的最佳存档器库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可在我的 iOS 应用程序中使用的存档器库 zip 或其他格式 就以下方面而言 最好的图书
  • XNA:Unload() 的意义是什么?

    XNA 游戏有一个Unload 方法 其中内容应该被卸载 但这有什么意义呢 如果所有内容都被卸载 那么游戏一定会退出 在这种情况下 无论如何 所有内容都会被垃圾收集 对吗 据我了解 它对于任何标准用途都没有用 因为正如您所说 垃圾收集器为您
  • 强制routerlink刷新组件

    我创建了一个非常基本的 Angular 5 应用程序 我有一个始终显示的左侧菜单 它是带有引导程序的 asp net core2 0 mvc 项目骨架的一部分 我在此菜单中创建了 2 个链接 li a Component 1 a li li
  • Jquery获取javascript文件而不运行

    我想使用 jquery 获取文件的内容 通常我可以使用 get file function data alert data 当我尝试获取 javascript 文件时 jquery 在返回回调之前运行 javascript 代码 如何在不运
  • 离子动态列表分隔符

    我已经被这个问题困扰了一段时间 所以我希望你能让我朝正确的方向前进 我的角度工厂返回一个看起来像这样的对象 name Fall year 20xx id some id 这是一个学期列表 每个学期都有一个对象 其中包含名称 年份和学期 ID
  • 具有相同属性名称的 AutoMapper TwoWay 映射

    给定这两个对象 public class UserModel public string Name get set public IList
  • 当表单操作转到第三方网站时将数据传递到“谢谢”页面

    我有一个网络表单 它收集用户的邮政编码作为字段之一并将其发布到第三方网站
  • Fedora 21 带 clang,不带 gcc

    你能 合理地 让 Fedora 21 变得只有 llvm clang libc libc abi 吗 我发现有些东西暗示不可以 但它们都已经有 3 岁了 从那时起 llvm clang 已经取得了长足的进步 通过全新安装 我尝试了 yum