星期日, 三月 11, 2007

Linux下C编程注意事项(zt)

一般可以用gcc编译器

1. 头文件
象conio.h应该变成curses.h

2. 没有itoa函数
itoa? 不对吧,标准C/C++里根本没有这个函数。即使在Windows平台下某些编译器提供了该函数[3],没有任何移植性不说,还只能解决int类型(也许 其他函数还可以解决long、unsigned long等类型),浮点类型又怎么办?当然,办法还是有,那就是:sprintf。

char s[100];
sprintf(s, "%f", 123.123456);

3. 关于sqrt,sin和cos函数
就算是引入math.h头文件,也不会找到sqrt,sin和cos函数。应该用链接库来解决。
有 时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面 去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a).当然,如果找不到,只有一个笨方 法.比如我要找sin这个函数所在的库. 就只好用 nm -o /lib/*.so|grepsin>~/sin 命令,然后看~/sin文件,到那里面去找了.在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm).

4. Makefile出现missing separator的错误
原因是目标声明行下面的命令行必须用Tab键分开(而不是空格)

PG: PG.o
[ Tab键 ]gcc -o PG -O -O2 -lm /lib/ld-2.2.93.so PG.o
PG.o: PG.c pointgroup.h
[ Tab键 ]gcc -c -O -O2 PG.c
clean:
[ Tab键 ]rm -f *.o

5. 注意文件的DOS格式字符
调试的时候应该注意文件可能有DOS格式字符,必须先用如下命令去掉文件中的DOS格式字符:
tr -d tmp_file
mv tmp_file

附:
*******************************************************
gcc 常用命令行列表
*******************************************************
http://www.chinaunix.net 作者:wayne168 发表于:2003-04-19 16:02:55

-o FILE
指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out.

-c
只编译不链接

-DFOO=BAR
在命令行定义预处理宏FOO,其值为BAR

-IDIRNAME
将DIRNAME加入到头文件的搜索目录列表中

-LDIRNAME
将DIRNAME加入到库文件的搜索目录列表中,缺省情况下gcc 只链接共享库

-static
链接静态库,即执行静态链接

-lFOO
链接名为libFOO的函数库

-g
在可执行程序中包含标准调试信息

-ggdb
在可执行程序中包含只有GNU debugger才能使别的达两条是信息

-O
优化编译过的代码

-ON
指定代码优化的级别为N,o<=N<=3

-ansi
支持ANSI/ISO C的标准语法,取消GNU的语法扩展中与该标准有冲突的部分
(但这一选项并不能保证生成ANSI兼容的代码)

-pedantic
允许发出ANSI/ISO C标准所列出的所有警告

-pedantic -errors
允许发出ANSI/ISO C标准所列出的所有错误

-traditional
支持Kernighan & Ritchie C语法(如用旧式语法定义函数);如果不知道这个选项的含义,也没有关系

-w
关闭所有警告,建议不要使用此项

.Wall
允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告

-werror
把所有警告转换为错误,以在警告发生时中止编译过程

-MM
输出一个make兼容的相关列表

-v
显示在编译过程的每一步中用到的命令

没有评论: