Linux中有關編譯鏈接要是用的庫掃描路徑,與有關環境變量
靜態庫鏈接時搜索路徑順序:
1.ld會去找GCC命令中的參數-L
2.再找gcc的環境變量LIBRARY_PATH
3.再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的
動態鏈接時、執行時搜索路徑順序:
1.編譯目標代碼時指定的動態庫搜索路徑;
2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
4.默認的動態庫搜索路徑/lib;
5.默認的動態庫搜索路徑/usr/lib。
有關環境變量:
LIBRARY_PATH環境變量:指定程序靜態鏈接庫文件搜索路徑
LD_LIBRARY_PATH環境變量:指定程序動態鏈接庫文件搜索路徑
鏈接過程
建立靜態庫方法(包括靜態內部庫和動態外部庫)
gcc -c fun.c
ar cqs libfun.a fun.o
編譯中使用靜態庫方法
gcc call.c -static -L. -lfun -o fun_static_call
建立動態庫(包括動態內部庫和動態外部庫)
gcc fun.c -fPIC -shared -o libfun.so
編譯中使用動態庫方法
gcc call.c -L. -lfun -o fun_dyn_call
編譯器會先在path文件夾下搜索libxxx.so文件,如果沒有找到,繼續搜索libxxx.a(靜態庫)。
執行過程
無論是使用動態庫還是外部庫鏈接時都是使用的ld連接器;
使用動態庫的程序執行時使用動態加載器。在Linux 下,加載器是/lib/ld-Linux.so.X(X是版本號)。然後加載器搜索、加載程序所要使用的動態鏈接庫。搜索順序見上。