C语言编译中出现directory,c语言学习第二周问题总结

本周是学习C语言的第二周,遇到不少问题。真是应了一句古话:说来容易,做起来难。很多平时觉得挺简单的技术,真正实现起来却是问题不断。遇到问题然后解决问题,也就是所谓的成长的过程吧。现将本周遇到的问题,总结如下:

1.  数学函数库的编译问题

当程序中使用了三角函数和一些常用数学函数时,需要做到如下两点:

1,.包含头文件:#include ;

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' )))

即:|| 的前后表达式都用括号括起来,更加明确层次关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值