動態庫鏈接問題解決

一 .編譯動態庫:
使用動態庫的四種方法:
  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 實現文件中去了, 導致出現鏈接不上的錯誤.
        此時一運行程序, 當加載到這步時, 就出現段錯誤….

發佈了76 篇原創文章 · 獲贊 23 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章