注:程序中dlopen,dlsym,dlclose這三個(gè)程序使用過(guò)了
編譯命令:cc-o testlibdl testlibdl.c -ldl
執(zhí)行./testlibdl結(jié)果
/lib/i386-linux-gnu/libc.so.6:undefined symbol: Apply
雖然程序沒(méi)干啥事,但是它使用libdl庫(kù)的,并且沒(méi)有出現(xiàn)連接錯(cuò)誤。難道是因?yàn)閹?kù)路徑的問(wèn)題?嘗試了添加符號(hào)鏈接文件到/lib,/usr/lib這些目錄下,錯(cuò)誤依舊,這樣我已經(jīng)消耗了2,3小時(shí),這樣不斷的編譯,不斷的查看Makefile文件(足足有800多行的Makefile文件,看的我頭都大了)
后,在我快要放棄的時(shí)候,在參考[5]中發(fā)現(xiàn)這樣的話“本人是安裝的desktop-i386版本。make的時(shí)候提示dlopen、dlclose等函數(shù)找不到.檢查上邊的編譯命令發(fā)現(xiàn)其中有-ldl選項(xiàng),但是位置不對(duì),位置應(yīng)該放到后去,而編譯命令的后一個(gè)是-lm.于是在出錯(cuò)的幾個(gè)文件夾下面將Makefle中的-lm選項(xiàng)后面加上-ldl再執(zhí)行make命令即可編過(guò)”
問(wèn)題已經(jīng)找到了,是-ldl命令的位置的問(wèn)題。因?yàn)?lm總是出現(xiàn)在后,我在所有編譯問(wèn)題的目錄Makefile的LIBS=-lm后面添加了一個(gè)-ldl選項(xiàng),然后編譯一下,遇到通過(guò)的添加-ldl選項(xiàng),終于都執(zhí)行make通過(guò)了。
后 sudo make install,將cppunit安裝到/usr/local/lib中。我們可以使用命令 ls /usr/local/lib/ |grep libcppunit 查看是否整個(gè)安裝好了。如果安裝好了,會(huì)出現(xiàn)下面這些庫(kù).
libcppunit-1.12.so.1
libcppunit-1.12.so.1.0.0
libcppunit.a
libcppunit.la
libcppunit.so
在至此探索中發(fā)現(xiàn)libldl.so庫(kù)是一個(gè)有意思的動(dòng)態(tài)鏈接庫(kù)。
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 .小結(jié)
a)有些問(wèn)題雖然解決方法很簡(jiǎn)單,但是,在遇到問(wèn)題后想到這個(gè)簡(jiǎn)單的解決方法卻不那么的容易。
b)難的是要找到問(wèn)題在哪里,知道了問(wèn)題在哪里后,很多事情都是可以解決的,F(xiàn)實(shí)是很多情況下,我們不知道問(wèn)題在何處,因此需要探索,需要”撞墻“。