有滴滴云GPU 云主机的用户反馈,在使用 GPU 主机的时候,有些应用场景需要比较高版本的 GCC,如 GCC5.2,而自己构建时碰到了一些状况,不好解决。
会有多种情况导致需要高版本的 GCC,其中有一种情况是对 Cxx 支持能力的要求。这里列上 GCC 对 Cxx 支持能力的链接 https://gcc.gnu.org/projects/cxx-status.html 以做备查。
另外一种情况是 GLIBCXX 的版本问题,可以通过构建新的 GCC 来解决,但本质是因为构建 GCC 过程中构建了新的 libstdc++ 库,所以可以通过直接构建新的 libstdc++ 来解决,而不需要构建整个 GCC。
还有一种特别的情况,GLIBC 的版本问题,跟 libstdc++ 类似,可以通过构建 glibc 库来解决,但是由于 libc 这个库非常特殊并且很重要,大量的命令动态依赖于这个库,所以此处不建议用户构建 glibc 库。
区分这些情况便于我们决定怎么解决问题。迫切需要但又未曾接触过 GCC 编译的用户,编译 GCC 时可能会觉得茫然无措,但其实较新版本的 GCC 编译过程是相当清晰明了的。
以下内容以 GCC5.2 为例,在本地做 GCC 的编译。
下载后解压
从 GCC 官网上下载 GCC5.2 版本,下载过程不作赘述。根据不同的压缩格式选择不同解压缩命令,此处以 .tar.bz2 为例:
1 2 |
tar -xjvf gcc-5.2.0.tar.bz2 |
如果是 gzip 格式,使用 tar -xzvf 参数;·
解决依赖
GCC 从较新版本开始,提供了下载依赖项的脚本,强烈建议使用该脚本下载依赖,自己安装下载很容易出错。
进入解压后 GCC 根目录,执行以下操作:
1 2 3 |
cd gcc-5.2.0 ./contrib/download_prerequisites |
等待该脚本正确执行完毕。
构建
特别注意,如果确定需要重新编译 GCC,请务必留意规格,编译相对会耗一些资源,如果规格不合适,很可能会编译失败。构建 GCC 会需要一段时间,并且对内存等有一定要求。本文使用的配置是 16C32G。
创建构建目录。较新的 GCC 构建都建议在独立的构建目录中做操作,结合上文下载完依赖之后,退出 GCC5.2 目录,然后创建并进入构建目录:
1 2 3 4 |
cd ../ mkdir gcc-build cd gcc-build |
配置:
需要安装到哪个路径下,通过 prefix 指定,不需要 32 位的兼容库的话添加 –disable-multilib ,建议这么做是因为如果编译 32 位的兼容库,还会需要解决不少依赖。
简单的配置如下:
1 2 |
../gcc-5.2.0/configure --prefix=/opt/gcc --enable-languages=c,c++ --disable-multilib |
构建:
1 2 |
make -j 16 |
安装
构建完之后安装
1 2 |
sudo make install |
特别注意 install 后的一段说明,具体说明如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Libraries have been installed in: /opt/gcc/lib/../lib64 If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' |
要使用构建后的 GCC,还需要做一些环境变量的配置,环境路径与上述 prefix 配置相关,本例中配置如下:
1 2 3 |
export PATH=/opt/gcc/bin/:$PATH export LD_LIBRARY_PATH=/opt/gcc/lib64/:$LD_LIBRARY_PATH |
运行 gcc/g++ 命令和结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ gcc --version gcc (GCC) 5.2.0 Copyright © 2015 Free Software Foundation, Inc. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保; 包括没有适销性和某一专用目的下的适用性担保。 $ g++ --version g++ (GCC) 5.2.0 Copyright © 2015 Free Software Foundation, Inc. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保; 包括没有适销性和某一专用目的下的适用性担保。 |
之后可以尝试使用该 gcc/g++ 来编译程序了。
相关一些命令
查看 libstdc++ 库支持的 GLIBCXX 版本:
1 2 |
strings libstdc++.so | grep GLIBCXX |
查看 libc 库版本支持的 GLIBC 版本:
1 2 |
strings /usr/lib64/libc.so.6 | grep GLIBC |
查看 GCC 每一个优化项打开了哪些优选参数:
1 2 |
$ gcc -Q --help=optimizers |
有兴趣的用户可以对比观察系统默认版本的优化项和新构建的优化项之间的差异。
本文作者:孔建钢