I am LAZY bones?
AN ancient AND boring SITE

分类: 'CLI软件' 的归档

gcc命令行详解[转载]

gcc命令行详解[转载]

1.gcc包含的c/c++编译器

gcc,cc,c++,g++: gcc和cc是一样的,c++和g++是一样的。一般c程序就用gcc编译,c++程序就用g++编译。

2.gcc的基本用法

gcc test.c这样将编译出一个名为a.out的程序
gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字

3.为什么会出现undefined reference to ‘xxxxx’错误?

首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。

4.-l参数和-L参数

-l参数 就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到 /usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与 libtest.so配套的头文件)。

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在 /usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是- L/aaa/bbb/ccc -ltest

另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x, /lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行
gtk-config –libs

就能得到以下输出
“-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm”

这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了–libs参数外还有一个参数是–cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config –libs –cflags,看看输出结果。现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个xxxx -config --libs --cflags,比如编译一个gtk程序:gcc gtktest.c gtk-config --libs --cflags这样就差不多了。注意不是单引号,而是1键左边那个键。

除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法跟xxx-config类似,但xxx- config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成,用pkg-config --list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg-config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+, pkg-config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一样的。比如:gcc gtktest.c pkg-config gtk+ –libs –cflags`。

5.-include和-I参数

-include用来包含头文件,但一般情况下包含头文件都在源码里用#i nclude xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上- I/myinclude参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I 参数的。

6.-O参数

这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcc test.c -O2,优化得到的程序比没优化的要小,执行速度可能也有所提高(我没有测试过)。

7.-shared参数

编译动态库时要用到,比如gcc -shared test.c -o libtest.so

8.几个相关的环境变量

PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconfig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。
CC:用来指定c编译器。
CXX:用来指定cxx编译器。
LIBS:跟上面的–libs作用差不多。
CFLAGS:跟上面的–cflags作用差不多。

CC,CXX,LIBS,CFLAGS手动编译时一般用不上,在做configure时有时用到,一般情况下不用管。

环境变量设定方法:
export ENV_NAME=xxxxxxxxxxxxxxxxx

9.关于交叉编译

交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比如在我们地PC平台(X86 CPU)上编译出能运行在sparc CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到sparc CPU平台上才能运行。当然两个平台用的都是linux。这种方法在异平台移植和嵌入式开发时用得非常普遍。

相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。

用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的gcc。

为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀,比如sparc-xxxx-linux-gnu-gcc,sparc-xxxx-linux-gnu-g++ 等等

10.交叉编译器的使用方法

使用方法跟本地的gcc差不多,但有一点特殊的是:必须用-L和-I参数指定编译器用sparc系统的库和头文件,不能用本地(X86)的库(头文件有时可以用本地的)。

例子:
sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib -I/path/to/sparcInclude

命令行控制音量程序aumix

香菇在irc上说gnome那个音量控制不够精确,变得太快。
让我想起那个命令行下的音量控制程序,当时忘记叫什么了,后来找了一下,想起来,叫aumix,默认没有安装apt-get一个。
看看用法:可以输入数值指定,类似

代码:
aumix -q -v75 -m 0 -c R -c+10 -m q

,当然也可以直接aumix,进去后再用键盘操作。

引用:
$ aumix -h
aumix 2.8 用法: aumix [-<channel option>[[+|-][<amount>]]|<level>|
R[ecord]|P[lay]|q[uery]] [-dhILqS] [-C <color scheme file>] [-f <rc file>]通道选项:
v:主音量 x:混音监视器
b:低音 W:PCM 2
t:高音 r:录音
s:合成器 i:输入增益
w:PCM o:输出增益
p:PC 扬声器 1:线路 1
l:线路 2:线路 2
m:话筒 3:线路 3
c:CD

其它选项:
C: start in curses mode (and optionally specify color scheme)
d:调整除 /dev/mixer 外的另外的设备
f:指定用于保存和载入设置的文件(默认为 ~/.aumixrc 或 /etc/aumixrc)
h:打印该帮助信息
I:在完成非交互功能后启动到交互模式
L:载入设置
q:查询所有通道设置并打印
S:保存设置

文本模式irc

今天好奇,试了一下文本模式的irc,还挺好玩的,我的文本模式开了framebuffer是1024×768的,视野还挺开阔的。

安装:

代码:
sudo apt-get install irssi

先打开zhcon,不然,全都是乱码可不好。

代码:
zhcon –utf8

然后就直接

代码:
irssi

进入后要输命令自己连接上服务器:

代码:
/connect irc.freenode.org

进入后,默认的昵称是你的机器用户名,要改用户名就要

代码:
/nick bones7456

还要进入聊天室

代码:
/join #ubuntu-cn

就可以看到熟悉的人了,哈。用惯了xchat都是自动连接上设置好的频道的,不知道irssi有没有可以预设的,应该也有,改天再研究。

翻译 w3m 快捷键

个人认为w3m是一个非常不错的浏览器,其很多特点是图形界面的浏览器所不具备。
例如在公司上网的话,如果开着花花绿绿的网页,后面还坐着boss的话,心里肯定会发毛,但是如果用w3m的话,就会好很多了,嘿嘿。(不过w3m也是可以显示图片的哦!)
想找w3m的快捷键,发现没有比较完整的中文版本,就翻译了一个。

页面操作

SPC,C-v 向下翻页
b,ESC v 向上翻页
l,C-f 焦点向右
h,C-b 焦点向左
j,C-n 焦点向下
k,C-p 焦点向上
J 向上滚动一行
K 向下滚动一行
^,C-a 到行首
$,C-e 到行尾
w 到下一个单词
W 到上一个单词
> 右移一屏
< 左移一屏
. 屏幕右移一列
, 屏幕左移一列
g,M-< 到首行
G,M-> 到末行
ESC g 到指定行
Z 当前行居中
z 当前列居中
TAB 转到下个超链接
C-u,ESC TAB 到上个超链接
[ 到第一个超链接
] 到最后一个超链接超链接操作

超链接操作

RET 打开超链接
a, ESC RET 链接另存为
u 查看链接url
i 查看图片url
I 查看图片
ESC I 图片另存为
: 标记rul字符串为锚点
ESC : 标记ID串为锚点
c 查看当前页面的URL
= 显示当前页面属性
C-g 查看当前行号
C-h 查看历史记录
F 提交表单
M 用外部浏览器打开当前页面 (可以用 2 M 或者 3 M 来用第2、第3外部浏览器打来开)
ESC M 用外部浏览器打开链接 (可以用 2 ESC M 或者 3 ESC M 来用第2、第3外部浏览器打来开)

文件/流 操作

U 打开URL
V 打开文件
@ 执行外部命令并导入
# 执行外部命令并浏览

缓存操作(每个页面相当于一个缓存)

B 返回
v 查看源代码
s 选择缓存
E 编辑缓存代码
C-l 重画屏幕
R 刷新
S 页面另存为
ESC s 源码另存为
ESC e 编辑图片

缓存选择模式(也就是按了s以后)

k, C-p 上一缓存
j, C-n 下一缓存
D 删除当前缓存
RET 转至选择的缓存

书签操作

ESC b 打开书签
ESC a 添加当前页到书签

搜索

/,C-s 向前搜索
?,C-r 向后搜索
n 下一个
N 上一个
C-w 打开/关闭 循环搜索

标记

C-SPC 设定/取消 标记(这个键一般被输入法占用了)
ESC p 转至上一标记
ESC n 转至下一标记
” 使用正则表达式标记

杂项

! 执行外部命令
H 帮助
o 设置选项
C-k 显示接受到的cookie
C-c 停止
C-z 挂起(退出)
q 退出(需确认)
Q 退出而不确认

行编辑模式

C-f 光标向后
C-b 光标向前
C-h 删除前一字符
C-d 删除当前字符
C-k 删除光标后所有内容
C-u 删除光标前所有内容
C-a 光标到行首
C-e 光标到行尾
C-p 取得历史记录中的前一个词
C-n 取得历史记录中的后一个词
TAB,SPC 自动完成文件名
RETURN 确定

命令行音乐播放软件

mpg123 :最常用的命令行播放器,不多说了。
mpg321 :和mpg123差不多,但音质好很多。
music23:也和mpg123差不多。
moc:坛子里看到有人在力推,总得来说感觉还真不错,可以服务器模式运行,支持播放列表等,都是蛮先进的,呵呵。不过要弄成oss输出音质才可以。来张图:

统计文本文件行数(分析日志很有用哦)

wc

[语法]: wc [-lwc] 文件…
[说明]: 统计文件的行、字、字符数,若无指定文件,则统计标准输入
-l 只统计行数
-w 只统计字数
-c 只统计字符数
[例子]:
wc -l file1 file2 统计文件file1和file2 的行数

来源:http://www.xxlinux.com/linux/article/unix/rumen/2006-08-29/3844.html

SSH

公司有台服务器,需要SSH连上去才能在上面跑东西。

命令:

代码:
ssh username@IP

接下来会提示收到一个RSA key 需要输入yes确认接收。(这个只会出现一次以后都不会出现了),再输入username在服务器上的密码,就可以登录成功了。

还有互考文件要用到scp,命令:

代码:
scp 文件名 username@IP:~/mydir/
scp -r 目录 username@IP:~/mydir/

还可以加上-C参数启用压缩。

参考文章:http://www.lslnet.com/linux/dosc1/36/linux-267021.htm

mutt配置

由于evolution超慢(还不知道什么原因),就打算用mutt收邮件,这样应该挺快了吧!

但是发现mutt的配置还真不简单,自己研究的话不知道要话多久,不过还好有前辈研究过了,就转一下:
http://s5unty.blog.openrays.org/blog-htm-do-showone-tid-221.html

基本上照做就没事了,但是如果你的邮件服务器和我的一样,不需要TLS/SSL验证的话,按他那样就收不到邮件了。解决方法是在.fetchmailrc的最后加上一个sslproto ssl23
如下:

代码:
poll pop.somewhere.com proto pop3 uidl username “username” password “password” keep sslproto ssl23

还有一点需要特别注意的是,建立了.fetchmailrc和.msmtprc文件以后,默认的权限是644,这样是不行的没,因为这两个文件里面含有明文的密码,需要特别的保护。做法就是手工把这个两个文件的权限调成610,如下:

代码:
chomd 610 .fetchmailrc
chomd 610 .msmtprc

还有记一下fetchmail的官方FAQ:http://fetchmail.berlios.de/fetchmail-FAQ.html

引用:
配置mutt没有想像中的简单,所以要作好不断经历失败打击的心理准备。对于想拥有一个能简单收发邮件的mutt的门外汉来说,至少得需要几个小时。基本配置步骤

1.
首先是安装必须的软件
sudo apt-get install mutt fetchmail procmail msmtp
装mutt 之后,在命令行输入mutt开启mutt界面,首先在界面的下方,提醒我们”$HOME/Mail不存在。制造吗?”,有些像我一样急性子的人会毫不犹豫的no。然后开始寻找让mutt使用其它位置的目录作为信箱的办法。但是我相信你将花费很多的精力浪费在错误的认识上。原因是对mutt的误解,我为此付出了2个小时的代价,要知道它不是传统意义上的邮件客户端。信箱目录应该由负责接收邮件的程序控制,例如fetchmail。mutt只负责管理邮件,而不是收发邮件。
2.
安装了邮件接收程序fetchmail和邮件分拣程序 procmail后,首先分别创建各自的配置文件$HOME/.fetchmailrc和$HOME/.procmailrc,这样为的是让我们能独立使用fetchmail和procmail这两个程序通过pop接收并分拣邮件。

# $HOME/.fetchmailrc
poll pop.somewhere.com \
proto pop3 \
uidl \
username zhangsan \
password password \
keep

# $HOME/.procmailrc
# 用户邮箱目录的位置
MAILDIR=”/sun/mails/”
# 分拣日志保存的位置
LOGFILE=”/var/log/procmail.log”
# 邮件转换程序
FORMAIL=/usr/bin/formail

# 暂时未作任何分拣

# 所有经过分拣后的邮件都存储在$MAILDIR/default信箱中
:0
* .*
default

这时我们使用fetchmail -akv -m “/usr/bin/procmail -d %T”命令就可以把zhangsan在somewhere.com上的邮件通过pop下载到本地信箱/sun/mails/default文件中。这里要说明的是fetchmail的-a参数,此参数用于下载全部信件,如果不加此参数,fetchmail只会下载最新的信件,而不会重复下载已下载过的信件。已下载的信件由$HOME/.fetchids文件标识。
3.
如果参考以上设置,你已经可以正常的收到邮件,那就可以继续下面的配置。否则请先解决遇到的问题。下面我们继续配置邮件发送程序msmtp,配置文件比较简单易懂,需要注意的是tls和auth这两行,为了满足SMTP服务器对邮件发送者必须通过SSL或TLS认证的要求,请确认配置文件中包含这些内容。但是如果你的SMTP服务器不需要认证,则去掉这两行。

# $HOME/.msmtprc
defaults
logfile /var/log/msmtp.log

account company
host smtp.somewhere.com
from zhangsan@somewhere.com
port 25
user zhangsan
password password
tls on
auth on

account default: company

4.
最后要配置的就是我们的主角mutt了,这里只是简要的配置,更复杂的配置留给读者自己。一旦完成了mutt的配置,我们希望能立刻尝试用mutt发送邮件,所以借着以下示例立即创建一个属于你自己的$HOME/.muttrc文件吧。

# 默认信箱目录
set folder=”/sun/mails/”
# 已读的信箱
set mbox=”+incoming”
# 进入mutt后默认使用的信箱,可以考虑和$HOME/.procmailrc设置的默认信箱相同
set spoolfile=”+default”
# 不清楚
#set postponed=”+postponed”
# 已发送的信箱
set record=”+outgoing”

# 终端的编码
set charset=”UTF-8″
# 外发邮件使用的编码
set send_charset=”UTF-8″
# 用中文格式显示日期
set locale=”zh_CN.UTF-8″
# 解决没有设置字符编码的信件显示为乱码的问题
charset-hook ^us-ascii$ GB18030
# 解决主题为utf-8的信件标题显示为乱码的问题
charset-hook !UTF-8 GB18030
# 解决未经过MIME编码的信件显示为乱码的问题
set strict_mime=no
set assumed_charset=”GB18030″
# 解决中文附件名为乱码的问题
set rfc2047_parameters=yes

# 采用msmtp发送邮件
set sendmail=”/usr/bin/msmtp”
# 让mutt可以更好的阅读html邮件
auto_view text/html

配置好后,立刻启动mutt,按m,输入对方的邮件地址后回车,输入主题后回车,这时mutt会调用默认的编辑器vim,然后输入信件正文后保存退出,最后浏览并确认待发送邮件无误,按y即可完成发送。愿意的话在y之前可以按a添加附件。

遭遇问题(略)

文本界面播放电影。

今天试了一下,在文本界面也可以方电影了,哈哈,首先要在grub的menu.lst下加上参数vga=791,这样就可以打开控制台的framebuffer。
然后输入:mplayer -vo fbdev xxx.rmvb或者mplayer -vo fbdev2 xxx.rmvb就可以了。

全屏:mplayer -vo fbdev -zoom -fs -x 1024 -y 768 xxx.rmvb

apt使用参考

apt-cache search # ——(package 搜索包)
apt-cache show #——(package 获取包的相关信息,如说明、大小、版本等)
sudo apt-get install # ——(package 安装包)
sudo apt-get install # —–(package – – reinstall 重新安装包)
sudo apt-get -f install # —–(强制安装?#”-f = –fix-missing”当是修复安装吧…)
sudo apt-get remove #—–(package 删除包)
sudo apt-get remove – – purge # ——(package 删除包,包括删除配置文件等)
sudo apt-get autoremove –purge # —-(package 删除包及其依赖的软件包+配置文件等(只对6.10有效,强烈推荐))
sudo apt-get update #——更新源
sudo apt-get upgrade #——更新已安装的包
sudo apt-get dist-upgrade # ———升级系统
sudo apt-get dselect-upgrade #——使用 dselect 升级
apt-cache depends #——-(package 了解使用依赖)
apt-cache rdepends # ——(package 了解某个具体的依赖?#当是查看该包被哪些包依赖吧…)
sudo apt-get build-dep # ——(package 安装相关的编译环境)
apt-get source #——(package 下载该包的源代码)
sudo apt-get clean && sudo apt-get autoclean # ——–清理下载文件的存档 && 只清理过时的包
sudo apt-get check #——-检查是否有损坏的依赖