關於linux動態鏈結庫

2021-06-16 16:07:18 字數 1558 閱讀 5814

找工作之餘,把apue上乙個簡單面向連線的socket程式寫了下。上面用到別的章節的函式直接都用的extern,因為前天面試問我動態鏈結庫了,就想這讓用到的這些外部函式,直接動態鏈結。順便學習下,怎麼編譯動態鏈結庫的。沒學習那麼深,只是知道怎麼製作,應用就好,可中間還是碰到了點小問題。

要判斷乙個程式有沒有動態鏈結庫,可以用ldd命令,如果目標程式沒有鏈結動態庫,則列印「not a dynamic executable」 (不是動態可執行檔案)

動態鏈結庫的生成:gcc -shared -fpic -o dest.so sorce1.c sorce2.c source3.so生成所需的檔案可以有另乙個動態庫。

動態鏈結庫的呼叫:gcc -g -o dest souce.c -l. -lsrc.so

原因:因為在動態函式庫使用時,會查詢/usr/lib、/lib目錄下的動態函式庫,而此時我們生成的庫不在裡邊。

這個時候有好幾種方法可以讓他成功執行:

(1)最直接最簡單的方法就是把so拉到/usr/lib或/lib中去,但這好像有點汙染環境吧?

(2)export ld_library_path=$(pwd)

(3)可以在/etc/ld.so.conf檔案裡加入我們生成的庫的目錄,然後/sbin/ldconfig

對於方法2,我直接在生成可執行程式的指令碼檔案中匯出:

#! /bin/sh

rm -f client

gcc -o client clinet_uptime.c -l/home/camel/sort/c/apue/16 -lcrdyn

export ld_library_path=$(pwd)

自己的例項如下:

生成 .so的原始檔:

#include "connect_retry.h"

int connect_retry(int sockfd, const struct sockaddr *addr, socklen_t alen)

return (-1);

}

引用的標頭檔案

#ifndef connect_retry_h

#define connect_retry_h

#include #define maxsleep 128

int connect_retry(int sockfd, const struct sockaddr* addr, socklen_t len);

#endif

用到其中函式的原始檔:

#include #include "connect_retry.h"

#include #include #include #include #include #include #include #define maxaddrlen 256

#define buflen 128

//extern int connect_retry(int fd, const struct sockaddr *addr, socklen_t );

Linux 關於動態鏈結庫以及靜態鏈結庫的一些概念

庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如 libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,通常使用建立符號連線的方...

Linux 關於動態鏈結庫以及靜態鏈結庫的一些概念

動態庫 dynamic link library abbr,dll 技術是程式設計中經常採用的技術。其目的減少程式的大小,節省空間,提高效率,具有很高的靈活性。採用動態庫技術對於公升級軟體版本更加容易。與靜態庫 static link library 不同,動態庫裡面的函式不是執行程式本身的一部分,...

linux動態鏈結庫

在做完mini6410移植全攻略後,打算把自己的linux c筆記,貼出來和大家共享,有不對支援希望大家指出,謝謝!在上篇文章中,是對靜態鏈結庫的介紹,其實有了上面的介紹動態鏈結庫的製作就簡單了,這篇來製作動態鏈結庫 建立動態鏈結庫 cpp view plain copy print?gcc sha...