注:程序中dlopen,dlsym,dlclose这三个程序使用过了
编译命令:cc-o testlibdl testlibdl.c -ldl
执行./testlibdl结果
/lib/i386-linux-gnu/libc.so.6:undefined symbol: Apply
虽然程序没干啥事,但是它使用libdl库的,并且没有出现连接错误。难道是因为库路径的问题?尝试了添加符号链接文件到/lib,/usr/lib这些目录下,错误依旧,这样我已经消耗了2,3小时,这样不断的编译,不断的查看Makefile文件(足足有800多行的Makefile文件,看的我头都大了)
后,在我快要放弃的时候,在参考[5]中发现这样的话“本人是安装的desktop-i386版本。make的时候提示dlopen、dlclose等函数找不到.检查上边的编译命令发现其中有-ldl选项,但是位置不对,位置应该放到后去,而编译命令的后一个是-lm.于是在出错的几个文件夹下面将Makefle中的-lm选项后面加上-ldl再执行make命令即可编过”
问题已经找到了,是-ldl命令的位置的问题。因为-lm总是出现在后,我在所有编译问题的目录Makefile的LIBS=-lm后面添加了一个-ldl选项,然后编译一下,遇到通过的添加-ldl选项,终于都执行make通过了。
后 sudo make install,将cppunit安装到/usr/local/lib中。我们可以使用命令 ls /usr/local/lib/ |grep libcppunit 查看是否整个安装好了。如果安装好了,会出现下面这些库.
libcppunit-1.12.so.1
libcppunit-1.12.so.1.0.0
libcppunit.a
libcppunit.la
libcppunit.so
在至此探索中发现libldl.so库是一个有意思的动态链接库。
Ps:
Interface Libraries
NAME
libdl - dynamic linking library
SYNOPSIS
cc [ flag... ] file... -ldl [ library... ]
DESCRIPTION
Historically, functions in libdl provided for dynamic linking support.
This functionality now resides in libc(3LIB).
This library is maintained to provide backward compatibility for both
runtime and compilation environments. The shared object is implemented
as a filter on the runtime linker. See ld.so.1(1). New application
development need not specify -ldl.
INTERFACES
The shared object libdl.so.1 provides the following public interfaces.
See Intro(3) for additional information on shared object interfaces.
dladdr dladdr1
dlclose dldump
dlerror dlinfo
dlmopen dlopen
dlsym
6 .小结
a)有些问题虽然解决方法很简单,但是,在遇到问题后想到这个简单的解决方法却不那么的容易。
b)难的是要找到问题在哪里,知道了问题在哪里后,很多事情都是可以解决的。现实是很多情况下,我们不知道问题在何处,因此需要探索,需要”撞墙“。