linux c 語言程式設計環境:動態庫和靜態庫的製作
庫: 庫用於將相似函式打包在一個單元中。然後這些單元就可為其他開發人員所共享,並因此有了模組化程式設計這種說法 — 即,從模組中構建程式。Linux 支援兩種型別的庫,每一種庫都有各自的優缺點。靜態庫包含在編譯時靜態繫結到一個程式的函式。動態庫(也叫共享庫)則不同,它是在載入應用程式時被載入的,而且它與應用程式是在執行時繫結的。Linux系統有幾個重要的目錄存放相應的函式庫,如/lib, /usr/lib; 標頭檔案放在/usr/include。
靜態庫: 這類庫的名字一般是libxxx.a;利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都被整合進目的碼中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進可執行檔案了。當然這也會稱為它的缺點,因為如果靜態函式庫改變了,那麼你的程式必須重新編譯,而且體積也較大。
動態庫 :這類庫的名字一般是libxxx.so,動態庫又稱共享庫;相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目的碼中,你的程式執行到相關函式時才呼叫函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的升級比較方便。而且如果多個應用程式都要使用同一函式庫,動態庫就非常適合,可以減少應用程式的體積。
靜態庫製作:
gcc -c file1.c
gcc -c file2.c
....
gcc -c fileN.c
ar -rcs libname.a file1.o file2.o ... fileN.o
動態庫製作:
gcc -shared -fpic -o libname.so file1.c file2.c ... fileN.c
編譯:
gcc main.c -o test_lib -L lib_path -lname
編譯:
[[email protected] app]$ gcc main.c
main.c:14:20: error: crypto.h: No such file or directory
-I 指定標頭檔案的路徑
連結:
[[email protected] app]$ gcc -static main.c -o app -L./libs -lcrypto -lfunc
/tmp/ccfrMcUo.o: In function `main':
main.c:(.text+0xa): undefined reference to `crypt0'
collect2: ld returned 1 exit status
-L 指定庫的路徑 -l 指定庫的名字 -I 指定標頭檔案路徑
動態庫和靜態庫同時存在,預設是使用動態庫。如果要用靜態庫,加上-static連結選項。
執行:
[[email protected] app]$ ./app
./app: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directoryLD_LIBRARY_PATH: 告訴系統執行程式的時候,除了/lib, /usr/lib以外還到哪裡找動態庫。
PATH: 告訴系統執行的Linux命令查詢的路徑。
下面我們來舉個例子:
在建立函式庫前,我們先來準備舉例用的源程式,並將函式庫的源程式編譯成.o檔案。
一:編輯得到舉例程式——
test.h(見程式1)為該函式庫的標頭檔案。
test.c(見程式2)是函式庫的源程式。
main.c(見程式3)為測試庫檔案的主程式。
程式1:test.h
#ifndef _TEST_H_
#define _TEST_H_
int g_var;
extern int add(int a, int b);
#endif /* ----- #ifndef _TEST_H_ ----- */
程式2:test.c
int add(int a, int b)
{
return a+b;
}
程式3:main.c
#include <stdio.h>
#include "test.h"
#define MIN 1
#define MAX 4
int main (int argc, char **argv)
{
add(MIN, MAX);
#ifdef DEBUG
printf("Running here <%s:%d> %s()\n", __FILE__, __LINE__, __FUNCTION__);
#endif
return 0;
}
第二:將test.c編譯生成test.o檔案
無論是動態庫還是靜態庫,都需要將test.c 編譯成test.o檔案
即:[email protected] 20:35:19 ~/??/gcc $ gcc -c test.c 用 ls命令檢視是否生成了test.o檔案; |
結果如下:main.c test.c test.h test.o 靜態庫製作:[email protected] 20:35:19 ~/??/gcc $ ar -rcs libppp.a test.o (這類庫的名字一般是libxxx.a,可自己命名) 編譯:[email protected] 20:46:19 ~/??/gcc $ gcc main.c -L. -lppp -I. 用ls命令檢視是否生成a.out檔案 則執行a.out. |
動態庫的製作:[email protected] 20:35:19 ~/??/gcc $ gcc -shared -fpic -o libppp.so test.o ls命令檢視是否生成了libppp.so檔案 編譯:[email protected] 20:42:55 ~/??/gcc $ gcc main.c -L. -lppp -I [email protected] 20:44:06 ~/??/gcc $ ls 結果如下:[email protected] 20:44:06 ~/??/gcc $ ls a.out libppp.a libppp.so main.c test.c test.h test.o 執行:[email protected] 20:44:08 ~/??/gcc $ ./a.out ./a.out: error while loading shared libraries: libppp.so: cannot open shared object file: No such file or directory(系統因不知道動態庫在哪裡而產生錯誤) 需要告訴系統這個動態庫在哪裡; 即:[email protected] 20:44:16 ~/??/gcc $ export LD_LIBRARY_PATH=. |
相關推薦
linux c 語言程式設計環境:動態庫和靜態庫的製作
庫: 庫用於將相似函式打包在一個單元中。然後這些單元就可為其他開發人員所共享,並因此有了模組化程式設計這種說法 — 即,從模組中構建程式。Linux 支援兩種型別的庫,每一種庫都有各自的優缺點。靜態庫包
《我的第①本c語言程式設計書:C語言從入門到精通》掃描版.pdf
書籍簡介: 《C語言從入門到精通》以零基礎講解為宗旨,用例項引導讀者深入學習,採取“基礎知識→核心技術→趣味題解→專案實戰”的講解模式,深入淺出地講解C語言的各項技術及實戰技能。《C語言從入門到精通》第1篇【基礎知識】主要講解步入C的世界、常量與變數、資料型別、運算子和表示式、程式控制結構
C語言程式設計 學習筆記 動態記憶體分配(malloc)
如果輸入程式時,先告訴你個數,然後再輸入,要記錄每個資料(類似動態陣列) C99之前應該怎麼做呢? malloc()函式的作用就在此: int *a = (int*)malloc(n*sizeof(int)); malloc()函式的作用是向記憶體申請一個n*
Linux C語言程式設計(下篇) | gdb的使用
前兩篇Linux C語言程式設計(上篇) | gcc的使用和Linux C語言程式設計(中篇) | make的使用講述了在Linux下如何編譯得到可執行程式,那麼當程式執行結果不符合我們的預期時,如何進行除錯呢?這個時候就要使用到gdb工具了~ 1.gdb介紹 gdb也屬於GNU專案
Linux C語言程式設計(中篇) | make的使用
上一篇Linux C語言程式設計(上篇) | gcc的使用講述瞭如何使用gcc進行編譯,其中只是對hello.c這一個檔案進行編譯,那麼當我們需要編譯多個檔案的時候該怎麼做呢? 1.多檔案編譯例項 這個例子中分別在四個檔案(add.c, dec.c, mul.c, div.c)實現相
Linux C語言程式設計(上篇) | gcc的使用
嵌入式軟體開發主要使用C語言開發,編譯過程稱為交叉編譯 —— 在PC機上編譯出可以在嵌入式處理器上執行的程式,在真正進入嵌入式開發前,先來了解下如何使用gcc+make編譯C語言工程,如何用gdb除錯工程~ 1.C程式設計流程 1.1.編輯原始檔(.c) 使用文字編輯器(比如vi
linux c/c++ 動態庫和靜態庫的生成與使用
二.介紹 從原始碼到可執行程式,通常要經過最重要的兩大步是:編譯,連結。編譯就是將原始檔生成中間檔案的過程,在linux下就是生成 .obj檔案。連結就是用連結器將,這些個中間檔案有序地”糅合“在一起,構成一個可執行檔案。通常,一個.c檔案或者.cpp原始檔編譯後,就會對應生成一個.obj檔案。
C語言程式設計---3:順序程式設計
賦值表示式 賦值運算子按照“自右而左”的結合順序運算。因此 a = (b = 5); a = b = c; a = 5 + (c = 6); a = 11 a = (b = 4) + (c = 6); a = 10; a = (b = 10)/(c =
C語言程式設計---9:自定義資料型別
/*輸入學生的學號、姓名、性別、年齡、成績、家庭住址,輸出成績較高的學生資訊*/ #include<stdio.h> void main() { struct student
Linux C語言程式設計(十五)——程序、執行緒與訊號
1、程序 1.1 基本概念 每個程序在核心中都有一個程序控制塊( PCB)來維護程序相關的資訊, Linux核心的程序控制塊是task_struct結構體。 程序ID:統中每個程序有唯一的id,在C語言中用pid_t型別表示,其實就是一個非負整數。 程序狀態:有執行、掛起、
C語言程式設計題:用泰勒級數求自然數e的近似值
題目:C語言中用泰勒級數求e的近似值,直到最後一項小於 10的負6次方為止次方 e=1+1/1!+1/2!+...+1/n! 描述:觀察公式前兩項可以直接不用計算,合併為2,設定三個float型變數,e為結果,s為分子,i為分母,通過i累加再相乘之後實現分母
Linux C語言程式設計-Linux資料庫操作--Linux上C語言操作SQLServer---知識點總結+例項
*********************注意:為了保證文章的完整性和全面性,作者會不定期對文章進行更新和修正********************* 1.freetds是什麼? freetds其實就是個軟體而且是一款開源軟體,而且這個軟體支援相當多的系統,比如
Linux下RabbitMQ的編譯,生成動態庫和靜態庫
執行 編譯 ast lin 目錄 off href apt-get span 一、步驟 1、代碼托管處下載代碼 最新:https://github.com/alanxz/rabbitmq-c/archive/master.zip 穩定:https://g
Linux 動態庫和靜態庫
Linux作業系統中,依據函式庫是否被編譯到程式內部,將其分為兩大類,靜態函式庫和動態函式庫。 Linux下的函式庫放在/lib或/usr/lib,標頭檔案放在/usr/include。 在既有靜態庫又有動態庫的情況下,預設使用動態庫,如果強制使用靜態庫則需要加-static選項支援。
Linux中的動態庫和靜態庫(.a.la.so.o)
Linux中的動態庫和靜態庫(.a/.la/.so/.o) 原文地址:https://www.cnblogs.com/findumars/p/5421910.html 在windows下,一般可以通過檔案的字尾名來識別檔案的型別。在Linux下大致上也是可以的。但是要明
Linux下動態庫和靜態庫的連結
一、檢視連結了哪些指令 ldd 程式名字 二、在應用程式需要連線外部庫的情況下,linux預設對庫的連線是使用動態庫,在找不到動態庫的情況下再選擇靜態庫。使用方式為: gcc test.cpp -L. -ltestlib 如果當前目錄有兩個庫libtestlib.
Linux下怎麼建立動態庫和靜態庫
前言 linux下的生成的動態庫和靜態庫沒有windows下方便 linux下gcc編譯預設動態連結和release 程式執行後呼叫動態庫 動態庫: 程式在執行的時候才去連結動態庫的程式碼,多個程式
Linux系統的動態庫和靜態庫
靜態庫 靜態庫:一些公共程式碼是需要反覆使用,就把這些程式碼編譯為“庫”檔案;在連結步驟中,聯結器將從庫檔案取得所需的程式碼,複製到生成的可執行檔案中的這種庫。 程式編譯一般需經預處理、編譯、彙編和連結幾個步驟。靜態庫特點是可執行檔案中包含了庫程式碼的一份完整拷貝;缺點就是被多次
C語言學習筆記:指標函式和函式指標的淺析
#include "stdio.h" #include "stdlib.h" #include <string.h> /*--------------指標函式---------------*/ int *f(int a,int b ){ int
linux下g++ 編譯時動態庫和靜態庫的連結和標頭檔案問題
原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。 動態庫在編譯時不會被連線到目的碼中,而是在程式執行