关于cannot find -ltcl -ltk的问题

缘起

     经过一段时间的努力,终于将《深入例解计算系统》看到第4章了,然后就是编译其网站上提供的Y86的工具的使用遇到一些问题。

问题描述:

/usr/bin/ld: cannot find -ltk
/usr/bin/ld: cannot find -ltcl
    其makefile文件如下:

# Comment this out if you don't have Tcl/Tk on your system

#GUIMODE=-DHAS_GUI

# Modify the following line so that gcc can find the libtcl.so and
# libtk.so libraries on your system. You may need to use the -L option
# to tell gcc which directory to look in. Comment this out if you
# don't have Tcl/Tk.

TKLIBS=-L/usr/lib -ltk -ltcl

# Modify the following line so that gcc can find the tcl.h and tk.h
# header files on your system. Comment this out if you don't have
# Tcl/Tk.

TKINC=-isystem /usr/include

##################################################
# You shouldn't need to modify anything below here
##################################################

# Use this rule (make all) to build the Y86 tools. The variables you've
# assigned to GUIMODE, TKLIBS, and TKINC will override the values that
# are currently assigned in seq/Makefile and pipe/Makefile.
all:
	(cd misc; make all)
	(cd pipe; make all GUIMODE=$(GUIMODE) TKLIBS="$(TKLIBS)" TKINC="$(TKINC)")
	(cd seq; make all GUIMODE=$(GUIMODE) TKLIBS="$(TKLIBS)" TKINC="$(TKINC)")
	(cd y86-code; make all)

clean:
	rm -f *~ core
	(cd misc; make clean)
	(cd pipe; make clean)
	(cd seq; make clean)
	(cd y86-code; make clean)
	(cd ptest; make clean)
解决方法

     1.安装tcl和tk工具:sudo apt-get install tcl8.5-dev tk8.5-dev (注意是tcl8.5-dev不是tcl8.5,两者的区别就是tcl8.5仅仅下载安装了动态连接库,tcl8.5-dev将会安装静态连接库以及相关的支持的库文件)

     2.修改makefile: TKLIBS=-I/usr/lib -ltk8.5 -ltcl8.5

     其实,上面出现的这个问题非常的普遍,如果是Linux下使用源代码安装各种各样的软件,或这编写各种各样的helloworld程序,很容易遇到链接程序关于链接库的问题。关于链接,《深入例解计算机系统》中有专门的一章来讨论这个问题,我要抓紧时间,争取早日看到。在gcc 命令选项中,-lxxx好像连接的是静态连接库,至于动态连接库,不是很熟悉,不太清楚,可能需要使用命令行选项进行设置。

     为解决这个问题,google一下,发现一个博客介绍的挺详细的,具体内容如下:

“问题描述
/usr/bin/ld: cannot find -lxxx
其中xxx即表示函式库文件名称,其命名规则是:lib+库名(即xxx)+.so
可能原因: 
1 安装了,但相对应的lib版本不兼容
——我们需要的是libjpeg.so.8.0但安装的是libjpeg.so.6.0,
——或者是需要arm平台上的lib,但我们安装的是X86架构的,或反之本来是要编译arm平台上的却忘了指定交叉编译器
——我们需要32位但我们安装的是64位的
2 安装了,版本也对了,但lib(.so.version-num)的symbolic link 不正确,没有连结到正确的函式库文件(.so)
——我们需要的是libjpeg.so.8.0,也安装上了,但是实际使用时我们是查找的libjpeg.so,就需要相应的一个名为libjpeg.so的link 指向libjpeg.so.8.0
3 目录中确实没有相对应的lib
——系统中没有安装相对应的lib
——安装了,但不在这个目录且不在环境变量中
遇到此类问题的解决思路:
一、先详细了解问题,注意看错误的详细信息以进一步确定,若出现类似下面提示: 
/usr/bin/ld: skipping incompatible /usr/local/jpeg-6b when searching for -libjpeg.so
问题:版本不兼容
1、32位 与 64位 冲突问题
案例:
解决 yum provides libX11.so
libX11-devel-1.3-2.el6.x86_64 : Development files for libX11
Repo : base
Matched from:
Filename : /usr/lib64/libX11.so
解决:
yum install libX11-devel-1.3-2.el6.x86_64
安装 x86_64 兼容包

2、平台不兼容ARM X86 

案例:
很可能是编译是忘了指定交叉编译工具
make CC=arm-xilinx-linux-gnueabi-gcc
或者手动修改Makefile中的CC
3、版本号不对
安装新的版本(一般会有具体的提示,要求是什么版本)
二、若非版本问题
进入相关目录查看是否是lib(.so.version-num)的symbolic link 不正确,并建立链接
案例:
cd /usr/lib
ln -s libjpeg.so.6 libjpeg.so
 
三、真的没有要找的libxxx.so
1、安装了但不在系统变量所设的目录
修改Makefile 在编译选项中添加Lyourlibpath
案例:
修改plugins/input_uvc/Makfile
修改
CFLAGS = -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC

CFLAGS = -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC-I/home/wu/jpeg-6b/jpeg/include 

修改
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

$(CC) $(CFLAGS) -ljpeg -L/home/wu/jpeg-6b/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

备注:个人不是很明白-Ixxx 和-Lxxx的区别。

2、没安装
安装相关库 
先用yum 或apt-get search以确定库的确切名称
然后安装 
案例: 
sudo yum search libxtst-dev
sudo yum install libxtst-devel   
此问题所感
俗话说:对症下药,连别人是什么病都不知道,就开始给人开药方岂不可笑?
解决问题前先花时间研究问题。每个问题都有很多种可能的原因,以上这个简单的例子就可以说明问题,善于从一些错误提示和相关内容的字里行间去深入问题,对问题了解的越清楚,就越有利于定位问题,定位的越准就越利于快速解决问题。”
小结
      发现一个写博客的小技巧:充分利用百度百科和维基百科这样的知识库,像写词条一样写博客。越来越感觉信息的爆炸式的发展,如何在信息时代开发和维持自己的核心力,如何提高分析问题,收集信息,解决问题的效率,这些事情不得不仔细认真的考虑了。关于如何面对平坦的世界的竞争的问题,我要分出点时间看看《世界是平的》。

参考资料

[1]http://www.eefocus.com/wicoboy/blog/13-03/292170_cdab5.html

[2]http://www.arthurtoday.com/2010/06/ubuntu-tcl-tk.html#.UjHD5iEW3eU

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值