c语言学习第二周问题总结
2012-12-02 18:18
239 查看
本周是学习C语言的第二周,遇到不少问题。真是应了一句古话:说来容易,做起来难。很多平时觉得挺简单的技术,真正实现起来却是问题不断。遇到问题然后解决问题,也就是所谓的成长的过程吧。现将本周遇到的问题,总结如下:
1,.包含头文件:#include <math.h> ;
2. 编译时需要加上链接选项: -lm 。
解决办法:如果是全局变量,则在头文件中用extern声明该变量,并且只在包含该头文件中的某个文件中定义一次该变量。如果是局部变量,则用static定义并初始化该变量。(如果非必要,最好不要在头文件中定义变量)。
解决办法:设置编译选项CFLAGS += -I 头文件所在目录路径
解决办法:设置链接选项LDFLAGS += -l库名 –L库文件所在目录路径
(其中库名为去掉前面lib后的文件名,比如库文件libm.so, 对应的写法为:-lm)
如果动态库存在,只是路径不对时,有以下几种解决方法:
1. 修改/etc/ld.so.conf,将动态库的路径加入文件中,然后执行命令:ldconfig,如:
# echo"/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
2.设置环境变量LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
3.如果程序需要的库文件比系统目前存在的村文件版本低,可以做一个链接
比如:
error while loading sharedlibraries: libncurses.so.4: cannot open shared
object file: No such file or directory
ls /usr/lib/libncu*
/usr/lib/libncurses.a /usr/lib/libncurses.so.5
/usr/lib/libncurses.so /usr/lib/libncurses.so.5.3
6. 编译时设置为静态链接
当库文件目录下,相同名字的静态库(.a)和动态库(.so)同时存在时,编译链接选项如果是“ –l库名 -L库路径”, 默认识别为动态库。
如果想要设置为静态库,则用编译选项“-static –l库名 -L库路径”。 如果是静态链接,编译时必须注意LDFLAGS的使用顺序,$^ 必须写在$(LDFLAGS)之前,否则出错。
原因:./脚本名 // 创建一个新的shell,在新shell中执行脚本,脚本必须具有可执行x权限
解决办法:用 source 脚本名 //在当前shell中执行脚本,脚本可以不具有可执行x权限
或者 . 脚本名 //在当前shell中执行脚本,脚本可以不具有可执行x权限
执行脚本即可。
原因:SSH中的环境变量TERM默认设置为vt100。
解决办法:将TERM设置为xterm。设置方法如下:
Profile Setting- > Connection -> Terminal -> xterm。
设置好后用env 查看虽有环境变量,或者用 echo $TERM 查看当前的TERM设置值。
9.显示中文乱码
如果程序中有中文注释显示乱码,
解决办法:
exportLC_ALL=zh_CN.GB2312
exportLANG=zh_CN.GB2312
10. 动态链接出错”undefined reference to `__stack_chk_fail_local'”
原因: gcc版本高了,gcc 4.0以前的版本是用ld –share来生成共享库的,但是到了gcc 4.0以后的版本,这个命令就改成了gcc -share。 在终端里输入gcc -v查看,我的版本是gcc version4.4.3。
解决方法:
方法一:修改makefile ,将LD = ld 修改为 LD=gcc。
方法二:在编译选项CFLAGS中加入-fno-stack-protector。如:
CFLAGS = -Wall-O -g -fPIC -fno-stack-protector -I ../include
if(( *p >= 'a' ) && ( *p <='z' ) || ( *p >= 'A' ) && ( *p <= 'Z' ) || ( *p >= '0' )&& ( *p <= '9' ))
解决方法:你最好这样if(((*p >= 'a' ) && ( *p <= 'z' )) || (( *p >= 'A' ) && (*p <= 'Z' ))|| (( *p >= '0' ) && ( *p <= '9' )))
即:|| 的前后表达式都用括号括起来,更加明确层次关系。
1. 数学函数库的编译问题
当程序中使用了三角函数和一些常用数学函数时,需要做到如下两点:1,.包含头文件:#include <math.h> ;
2. 编译时需要加上链接选项: -lm 。
2. 变量重定义引起的编译问题
当同一个头文件被多个文件包含时,如果头文件中定义了变量并且初始化了该变量,而变量却没有用static或者extern存储类说明符声明时,编译会出现“multiple definition of xxx”的出错信息。解决办法:如果是全局变量,则在头文件中用extern声明该变量,并且只在包含该头文件中的某个文件中定义一次该变量。如果是局部变量,则用static定义并初始化该变量。(如果非必要,最好不要在头文件中定义变量)。
3. 编译时找不到头文件 “No suchfile or directory”
编译时因为找不到头文件的正确路径而引起的问题: “Nosuch file or directory”解决办法:设置编译选项CFLAGS += -I 头文件所在目录路径
4. 链接时找不到库文件问题“undefined reference to”
编译链接时因为找不到库文件的正确路径而引起的问题: “undefined reference to”解决办法:设置链接选项LDFLAGS += -l库名 –L库文件所在目录路径
(其中库名为去掉前面lib后的文件名,比如库文件libm.so, 对应的写法为:-lm)
5. 链接动态库文件,运行时出现错误“error while loading shared libraries:xxx.so
如果程序编译时链接的是动态库,则程序运行时,需要有动态库文件存在,如果动态库文件不在默认路径下或者根本就不存在,程序运行时会出现错误“error while loading shared libraries: xxx.so”。如果动态库存在,只是路径不对时,有以下几种解决方法:
1. 修改/etc/ld.so.conf,将动态库的路径加入文件中,然后执行命令:ldconfig,如:
# echo"/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
2.设置环境变量LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
3.如果程序需要的库文件比系统目前存在的村文件版本低,可以做一个链接
比如:
error while loading sharedlibraries: libncurses.so.4: cannot open shared
object file: No such file or directory
ls /usr/lib/libncu*
/usr/lib/libncurses.a /usr/lib/libncurses.so.5
/usr/lib/libncurses.so /usr/lib/libncurses.so.5.3
6. 编译时设置为静态链接
当库文件目录下,相同名字的静态库(.a)和动态库(.so)同时存在时,编译链接选项如果是“ –l库名 -L库路径”, 默认识别为动态库。
如果想要设置为静态库,则用编译选项“-static –l库名 -L库路径”。 如果是静态链接,编译时必须注意LDFLAGS的使用顺序,$^ 必须写在$(LDFLAGS)之前,否则出错。
7. shell脚本里设置外部环境变量失效问题
在脚本里用export 设置外部环境变量,如果用 ./脚本名 执行,退出脚本后,环境变量不会生效。原因:./脚本名 // 创建一个新的shell,在新shell中执行脚本,脚本必须具有可执行x权限
解决办法:用 source 脚本名 //在当前shell中执行脚本,脚本可以不具有可执行x权限
或者 . 脚本名 //在当前shell中执行脚本,脚本可以不具有可执行x权限
执行脚本即可。
8. SSH中空格显示为下划线
SSH中,用vi编辑C程序源文件,空格显示为下划线。原因:SSH中的环境变量TERM默认设置为vt100。
解决办法:将TERM设置为xterm。设置方法如下:
Profile Setting- > Connection -> Terminal -> xterm。
设置好后用env 查看虽有环境变量,或者用 echo $TERM 查看当前的TERM设置值。
9.显示中文乱码
如果程序中有中文注释显示乱码,
解决办法:
exportLC_ALL=zh_CN.GB2312
exportLANG=zh_CN.GB2312
10. 动态链接出错”undefined reference to `__stack_chk_fail_local'”
原因: gcc版本高了,gcc 4.0以前的版本是用ld –share来生成共享库的,但是到了gcc 4.0以后的版本,这个命令就改成了gcc -share。 在终端里输入gcc -v查看,我的版本是gcc version4.4.3。
解决方法:
方法一:修改makefile ,将LD = ld 修改为 LD=gcc。
方法二:在编译选项CFLAGS中加入-fno-stack-protector。如:
CFLAGS = -Wall-O -g -fPIC -fno-stack-protector -I ../include
11.显示:warning: suggestparentheses around && within ||
警告原因:假如使用了这样的语句:if(( *p >= 'a' ) && ( *p <='z' ) || ( *p >= 'A' ) && ( *p <= 'Z' ) || ( *p >= '0' )&& ( *p <= '9' ))
解决方法:你最好这样if(((*p >= 'a' ) && ( *p <= 'z' )) || (( *p >= 'A' ) && (*p <= 'Z' ))|| (( *p >= '0' ) && ( *p <= '9' )))
即:|| 的前后表达式都用括号括起来,更加明确层次关系。
相关文章推荐
- 《信息安全系统设计基础》第二周问题总结
- 第二周学习问题总结
- 《信息安全系统设计基础》第二周问题总结
- 多线程生产者与消费者问题的总结
- Eclipse RCP导出问题总结
- 提交中文数据乱码问题总结
- MySQL问题总结
- Android Geofence的学习(三)总结、Demo和问题
- 外出实施问题总结
- Eclipse导入外部项目问题总结1
- 201623班《程序设计与数据结构》-第六周作业问题总结
- 未将对象引用设置到对象的实例--可能出现的问题总结
- Android JNI的若干问题总结
- 20155309 南皓芯 2016-2017-2第二周学习总结
- hadoop 运行mahout 问题总结
- 一周复习总结(一)第二周
- ionic App问题总结系列之ionic点击系统返回键退出App
- [自学问题总结]索引器
- linux问题总结
- 总结安装VMware和centOS6.5的相关问题。