Fedora 21有clang,没有gcc

时间:2015-05-09 02:52:10

标签: gcc g++ clang llvm fedora-21

你能(合理地)将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 | 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&#39的问题在-lgcc_s上。 crtbegin无处可寻,gcc(没有_s)无处可寻。

yum install libgcc说已经安装了最新版本,没什么可做的。

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

我可以强制-stdlib = c ++和-lc ++ abi是默认的,或者至少安装了没有gcc的libc ++和libc ++ abi?

1 个答案:

答案 0 :(得分:2)

在没有GCC的情况下花了一些时间尝试使用libc ++和libc ++ abi,​​我发现它确实是可能的,即使在LLVM / clang的当前状态下有点问题。除了小型测试程序之外,我还能够构建CMake和其他一些用C ++编写而没有安装GCC的软件包,并且生成的二进制文件独立于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。在具有dpkg作为包管理器的Ubuntu上,文件

   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 ++的符号链接.so.x属于libstdc ++包,由libstdc ++ - devel包放入GCC库目录,所以你可以在卸载GCC后删除该目录,只需创建符号链接与libstdc ++。so.x相同的目录。

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

1)建立一个C程序:

clang progname.c

2)使用libstdc ++ headers / libs构建C ++程序:

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

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

3)使用libc ++ headers / libs构建C ++程序:

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

当您构建LLVM + clang等时,标头的位置就是它们的安装位置。

有关其他信息,请参阅http://libcxx.llvm.org/。使用libc ++ / libc ++ abi构建C ++代码时,可以使用-stdlib = libc ++而不是-I标志,但在我的测试中,只能使用从源构建的clang,而不是从存储库安装的clang(可以安装来自repo的clang并使用它来构建libc ++ / libc ++ abi;或者你可以使用gcc来构建libc ++(abi),然后删除gcc并将libs与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

上的文章