找工作之餘,把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...