|
[color="Blue"]A篇:基础概念
[color="Blue"]B篇:工具篇
C篇:手贱要锻炼
建立折腾环境
好了好了,正式开始了,把手套摘下来,点开一个终端。
首先,把上一篇提到的源都加好,然后
- su
- zypper in gcc webpin build cpp gcc-c++ make
复制代码 你不需要知道装的是什么,你只需要知道,没有他们不行。
开始几个任务练练手。
甲,升级到 gcc 4.5
openSUSE 11.2 默认是 gcc 4.4 可是半个月前刚发布了正式版的 gcc 4.5,既然要折腾,怎么能不升级呢?何况升级以后,优化编译出来的软件跑得更快。
先看看现在机器上是哪个版本的 gcc:(开头是 $ 表示手动输入)- $ which gcc
- /usr/bin/gcc
- $ l /usr/bin/gcc
- lrwxrwxrwx 1 root root 7 04-29 02:52 /usr/bin/gcc -> gcc-4.4*
复制代码 which gcc 是看看现在使用 gcc 命令对应的是哪个可执行文件
l /usr/bin/gcc
是 suse 特有的命令缩写,即 ls -l , 列出文件详情。结果表示 /usr/bin/gcc 本身是个符号链接(或者快捷方式这个说法更熟悉些$#%#%),指向 /usr/bin/ 同目录下的 gcc-4.4 文件。
明显吧,自带的 gcc 是 4.4 版本的。确认一下:
gcc --version
啥也别说了,开始升级吧。
- su
- zypper in gcc45 libstdc++45 libgomp45 libgfortran45 gcc45-c++ cpp45
复制代码 再说一遍:你不需要知道装的是什么,你只需要知道,没有他们不行。
补充一点:有它们也不一定能行。汗。。。
装完了,在检查升级成果的时候你会郁闷的发现:
gcc --version
还是4.4。煾 ¥%@@$#@^&@$%
rpm -ql gcc45
看看 rpm 文件都装到哪里去了。发现已经有 /usr/bin/gcc-4.5 文件了可是 /usr/bin/gcc 仍然指向 /usr/bin/gcc-4.3
手动搞定它:- su
- cd /usr/bin/
- rm gcc
- ln -s gcc-4.5 gcc
复制代码
不要以为这就完了:- su
- cd /usr/bin/
- rm cpp c++ g++ cc gcov
- ln -s g++-4.5 c++
- ln -s gcc-4.5 cc
- ln -s cpp-4.5 cpp
- ln -s g++-4.5 g++
- ln -s gcov-4.5 gcov
复制代码
顺便把 man 也改了吧,免得麻烦。
- su
- cd /usr/share/man/man1/
- rm c++.1.gz cc.1.gz cpp.1.gz g++.1.gz gcc.1.gz gcov.1.gz
- ln -s g++-4.5.1.gz c++.1.gz
- ln -s gcc-4.5.1.gz cc.1.gz
- ln -s cpp-4.5.1.gz cpp.1.gz
- ln -s g++-4.5.1.gz g++.1.gz
- ln -s gcc-4.5.1.gz gcc.1.gz
- ln -s gcov-4.5.1.gz gcov.1.gz
复制代码
gcc --version
发现搞定,如果仍然发现没有搞定,请直接撞墙后再试。
这只是折腾的第一步哦,熟悉一下文件操作而已。啊卡卡。
乙.确定优化参数
优化编译,关键就在优化参数,设定好了以后后面一直用了。
参数1. CHOST
个人电脑 32 位就是 i686-pc-linux-gnu
而 64 位就是 x86_64-pc-linux-gnu
其它的自己查。
参数2. CFLAGS
这是关键中的关键了,它把各种优化参数传给编译器(gcc),在编译时实现优化。
gcc 4.2 以上,-march=native -mtune=native 这两者是必要的优化参数,不管你32位64位AMD/Intel/等等什么的 CPU。也无所谓指令集差别,这两个选项写上以后会自定检测 CPU 支持的指令集,并自动打开相应指令集优化。
更多指令集相关的优化参见:
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
更多优化专用参数参见:
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Optimize-Options.html#Optimize-Options
其它优化参数 -O3。你也可以定成 -O4 O5 ...O9,目前它们和 -O3 是一样的。。。
表示优化级别为3(目前最高)。可能出现各种问题,各种文章都是推荐 O2 的,可是就我本身测试, O3 编译任何东西都没有出现过问题。折腾么,就要对自己狠一点。
一个相对安全的策略:- CFLAGS="-march=native -mtune=native -pipe -O3"
复制代码 里面 -pipe 除了加快编译速度没有别的影响。
相应的,还有一个 CXXFLAGS 参数,直接让他等于 CLAGS 。
CXXFLAGS="${CFLAGS}"
参数3. LDFLAGS
具体参见下面的链接,linker 的优化编译参数。一个相对安全的策略:
参考链接:
http://lamp.linux.gov.cn/Linux/optimize_guide.html
参数4.其它
MAKEOPTS="-jN"
大写N要用数字替换,一般是 cpu 核心数 +1 ,如果内存超过 2G 可以随便写大点,后果自负。
丙. 把优化参数写入文件
定下了优化参数以后,写入 /etc/profile.local 文件,没有就创建一个。
这个文件可以设置系统级别的变量,我们要用它设置编译优化参数。说明:这个文件不算是折腾的关键,但是它包含关键内容,而关键的内容会出现在很多关键的文件里面。
sudo vim /etc/profile.local
原则是把上面定下来的参数都 export 一遍,下次启动就生效了。比如我的文件是:- export CHOST="x86_64-pc-linux-gnu"
- export CFLAGS="-march=native -mtune=native -pipe -O3"
- export CXXFLAGS="${CFLAGS}"
- export LDFLAGS="-Wl,-O1 -s"
- export MAKEOPTS="-j6"
复制代码
而最关键的文件是 rpmrc, 这个文件本来在:
/usr/lib/rpm/rpmrc
要定义的是里面的 optflags 变量。
32 位机器,把里面这两行 copy 出来:- optflags: i586 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
- optflags: i686 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码 写入 /etc/rpmrc- optflags: i586 -O2 -g -m32 -march=i586 -mtune=i586 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
- optflags: i686 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码 然后编辑 /etc/rpmrc ,用上面定下来的 CFLAGS 字符的值替换字串中 "-O2 -g -m32 -march=i686 -mtune=i686" 这种部分,前面和后面不变。
比如如果上面的 CFLAGS="-march=native -mtune=native -pipe -O3"
这两行会换成:- optflags: i586 -march=native -mtune=native -pipe -O3 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
- optflags: i686 -march=native -mtune=native -pipe -O3 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码
64位光拷贝 optflags: x86_64 这一行到 /etc/rpmrc ,然后作相应编辑就行了。像上面 CFLAGS 同样的情况,64位的 /etc/rpmrc 只有一行。- optflags: x86_64 -march=native -mtune=native -pipe -O3 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
复制代码
其它架构,以此类推。
还有一个文件
sudo vim /usr/lib/rpm/macros
找到- LDFLAGS="${LDFLAGS:-%{-s:-s}}" ; export LDFLAGS; \
复制代码 把 -s:-s 换成你的 LCFLAGS, 比如你的 LDFLAGS 是 -Wl,-O1 -s,则这一行会成为- LDFLAGS="${LDFLAGS:-%{-Wl,-O1 -s}}" ; export LDFLAGS; \
复制代码
参数设定完成,可以重启了。
待续 |
|