一 .編譯動態庫:
使用動態庫的四種方法:
1. export LD_LIBRARY_PATH=/usr/lib64/( so所在路徑)
只對當前用戶的終端生效, 其他用戶沒用。
2.在該 sudo vim /etc/ld.so.conf文件下; 將動態庫的路徑加進來;然後 sudo ldconfig -v 進行更新。(這種方法的弊 端,可能其他的操作系統沒有這個配置文件)
1)sudo vim /etc/ld.so.conf
將(動態庫的路徑)加進來
2)sudo ldconfig -v更新 動態庫配置文件
3.無論什麼動態庫, Linux操作系統,都是默認去該目錄下 /usr/lib/查找使用的動態庫;
所以有兩種辦法:創建動態庫的軟連接至該目錄;
sudo ln -s (動態庫的源文件) /usr/lib;
這個方法的好處:(動態庫進行更新時,會把目錄下的一起更新,不需要額外操作;不推薦把動態庫拷貝至該目錄下 因爲更新時需要把該目錄下的都更新)。
sudo cp (動態庫的源文件) /usr/lib;
4. 修改該用戶下的 .bashrc 配置文件;將動態庫的路徑添加進來;重新執行配置文件:source .bashrc。(弊端:只 在當前用戶下有用)
二. 靜態庫的使用與上述方法一樣;
三. 最易忽視的步驟:
上面方法成功後,當編譯程序時,可能還會出現找不到動態庫的情況。(重點,本人已經在這裏吃過好幾次虧了)
此時:1. 需要在編譯程序時加上 -lm -ldl ;(有時加1個就有用,加2個也沒有壞處,以我目前的水平來看)
2.同時注意:切記加上述兩項時,一定要放到最末尾。原因:現在不明;
四。奉上自己寫的一段 Makefile
CC=gcc
CPPFLAGS= -I /home/yyx/02/openssl-1.0.1t/include/
CFLAGS=-Wall -g
LIBPATH = -L /usr/lib
LIBS= -lssl -lcrypto -lm -ldl
#找到當前目錄下所有的.c文件
src = $(wildcard ./src/*.c)
#將當前目錄下所有的.c 轉換成.o給obj
obj = $(patsubst %.c, %.o, $(src))
rsa = test_rsa
server01 = server_ssh_test
client01 = client_ssh_test
server02 = many_project_ssh_test
test = test_app
target = $(client01)
ALL:$(target)
#生成所有的.o文件
$(obj):%.o:%.c
$(CC) -c $< -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS)
#client01程序
$(client01):./src/client_ssh.o
$(CC) $^ -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS)
#clean指令
clean:
-rm -rf $(obj) $(target) ./src/*.o
#將clean目標 改成一個虛擬符號
.PHONY: clean ALL
五. 注意Linux下編譯動態庫的時候, 可能產生的鏈接問題;
1.該問題當時產生的情況: 在同一個文件夾下, 對一份文件進行了 多次備份(每次更新時都會); 導致的情況: 一個 .h 頭文件中包含的函數 會在多個文件中 都有實現;
———————–
產生的問題: 1. 直接編譯 可執行程序, 運行 .h頭文件 中的各項函數實現, 沒有任何問題產生.
2.當編譯動態庫後, 加載到 其他程序中運行時, 此時 會出現 段錯誤; 原因是: 動態庫中可能有 函數連接到 別的 .c 實現文件中去了, 導致出現鏈接不上的錯誤.
此時一運行程序, 當加載到這步時, 就出現段錯誤….