導航:首頁 > 操作系統 > linux編寫動態庫

linux編寫動態庫

發布時間:2022-09-06 18:13:24

『壹』 如何生成linux下的動態庫和靜態庫

靜態庫 靜態庫的後綴是.a,它的產生分兩步 Step 1.由源文件編譯生成一堆.o,每個.o里都包含這個編譯單元的符號表Step 2.ar命令將很多.o轉換成.a,成為靜態庫動態庫的後綴是.so,它由gcc加特定參數編譯產生。具體方法參見後文實例。123123 在 GNU...

『貳』 linux 編譯動態庫 automake 怎樣生成.ver文件

Linux下的動態庫以.so為後綴,我也是初次在Linux下使用動態庫,寫一點入門步驟,以便以後能方便使用。
第一步:編寫Linux程序庫
文件1.動態庫介面文件
//動態庫介面文件getmaxlen.h
#ifndef _GETMAXLEN_H_
#define _GETMAXLEN_H_
int getMaxLen(int *sel,int N);
#endif
文件2.動態庫程序實現文件
//動態庫程序實現文件getmaxlen.c
#include "getmaxlen.h"
int getMaxLen(int *sel,int N)
{
int n1=1,n2=1;
for(int i=1;i<N;i++)
{
if(sel[i]>sel[i-1])
{
n2 ++;
if(n2 > n1)
{
n1 = n2;
}
}
else
{
n2 = 1;
}
}
return n1;
}
第二步:編譯生成動態庫
gcc getmaxlen.c –fPIC –shared –o libtest.so
由以上命令生成動態庫libtest.so,為了不需要動態載入動態庫,在命令時需以lib開頭以.so為後綴。
–fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
–shared:指明編譯成動態庫。
第三步:使用動態庫
1. 編譯時使用動態庫
文件1.動態庫使用文件test.c
//使用動態庫libtest.so,該文件名為test.c
#include "getmaxlen.h"
int main()
{
int Sel[] = {2,3,6,5,3,2,1,2,3,4,5,6,7,6,5};
int m;
m = getMaxLen(Sel,15);
printf("%d",m);
return 0;
}
編譯命令:
gcc test.c –L . –l test –o test
–L:指明動態庫所在的目錄
-l:指明動態庫的名稱,該名稱是處在頭lib和後綴.so中的名稱,如上動態庫libtest.so的l參數為-l test。
測試:
ldd test
ldd 測試可執行文件所使用的動態庫
2. 動態載入方式使用動態庫
文件內容:
//動態庫的動態載入使用
int main()
{
void *handle = NULL;
int (*getMaxLen)(int *sel,int N);
int sel[] = {1,2,5,4,5,8,6,5,9,5,4,5,4,1};
handle = dlopen("./libtest.so",RTLD_LAZY);
if(handle == NULL)
{
printf("dll loading error.\n");
return 0;
}
getMaxLen = (int(*)(int *,int))dlsym(handle,"getMaxLen");
if(dlerror()!=NULL)
{
printf("fun load error.\n");
return 0;
}
printf("%d\n",getMaxLen(sel,15));
}
編譯命令:
gcc –ldl test1.c –o test
gcc -o test test.c ./libmytools.so

『叄』 Linux中如何創建靜態庫和動態庫

靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。 動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2: hello.c #include void hello(const char *name) { printf("Hello %s!\n", name); } 程序3: main.c #include "hello.h" int main() { hello("everyone"); return 0; } 無論動態庫還是靜態庫都需要用到.o文件來生成,先編譯生成.o文件。 # gcc -c hello.c 1:創建靜態庫 靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。 # ar cr libmyhello.a hello.o 使用靜態庫:只需要在你的源程序中加入包含你所需要使用到的函數的聲明(即包含頭文件),然後在gcc生成目標文件時候指明靜態庫就OK了(除非你包含的頭文件在/usr/include,庫文件在標准庫/usr/lib,/lib下,否則你得顯示指明他們的路徑) # gcc -o hello main.c -L. -lmyhello # ./hello Hello everyone! 刪除靜態庫文件運行./hello,程序正常運行,說明靜態庫公用函數已經鏈接到目標文件。 2: 利用.o文件創建動態庫 動態庫文件擴展名為.so。 # gcc -shared -fPCI -o libmyhello.so hello.o 動態庫的使用與靜態庫使用方式一樣 # gcc -o hello main.c -L. -lmyhello # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory 哦!出錯了。快看看錯誤提示,原來是找不到動態庫文件libmyhello.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。

『肆』 如何在linux下用matlab生成動態鏈接庫

首先如何製作Linux下的so 文件

首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處:

1.可以實現進程之間的資源共享。

什麼概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些「動態鏈接」額外的開銷,卻大大的節省了系統的內存資源。C的標准庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標准庫的代碼段.

2.將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows 就是一個很好的例子。

3.甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。

程序員在編寫程序的時候,可以明確的指明什麼時候或者什麼情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟體,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們

步驟:

首先建立一個函數文件fun.cpp 以及頭文件 fun.h

[cpp]view plain

  • exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/你的庫目錄

  • (2)
  • 更改/etc/ld.so.conf,添加我們的庫目錄,然後執行ldconf

    需要root許可權

    (3)加入/user/lib 或者/usr/lib64看你的機器位數,貌似拷貝的方法最湊效了,其他方法有時候行不通

    『伍』 Linux下的靜態庫和動態庫

    靜態庫

    可以把它想像成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為後綴的文件名,Windows下後綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、後綴:.a。

    靜態庫優缺點

    上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。

    優點:1、在最後,函數庫是被打包到應用程序中的,實現函數本地化、定址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。

    缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對於用戶來說,會導致整個程序重新下載。

    動態庫

    在程序編譯時不會被連接到目標代碼中,在後期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件後綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、後綴:.so

    動態庫優缺點

    優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。

    缺點:1、載入速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。

    『陸』 如何使用lame源代碼在編譯生成linux環境下的動態庫

    動態庫的生成
    1>首先生成目標文件,但是此時要加編譯器選項-fpic和鏈接器選項-shared,

    gcc -fpic -c add.c

    gcc -fpic -c sub.c

    生成中間文件add.o和sub.o

    2>其次生成動態庫

    gcc -shared –o libtiger.so add.o sub.o

    生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以後使用動態庫和main.c程序生成可執行程序

    說明:

    以上兩部也可以合成一步搞定:

    gcc -fpic -shared add.c sub.c -o libtiger.so

    2.使用動態鏈接庫

    在編譯程序時,使用動態鏈接庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行文件的時候會鏈接庫文件。

    1>使用命令:

    gcc -o main main.c -L ./ -ltiger

    2>-L指定動態鏈接庫的路勁,-ldtiger鏈接庫函數tiger。-ltiger是動態庫的調用規則。Linux系統下的動態庫命名方式是lib*.so,而在鏈接時表示位-l*,*是自己命名的庫名。

    3>但是程序會提示如下錯誤

    error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct

    這是因為程序運行時沒有找到動態鏈接庫造成的。程序編譯時鏈接動態庫和運行時使用動態鏈接庫的概念是不同的,在運行時,程序鏈接的動態鏈接庫需要在系統目錄下才行。

    4>使用以下方法可以解決此問題

    a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對目錄 /lib 下(但是,要是超級用戶才可以,因此要使用sudo哦,親)。就可以生成可執行程序了

    b.第二種方法是:將動態鏈接庫的目錄放到程序搜索路徑中,可以將庫的路徑加到環境變數LD_LIBRARY_PATH中實現:

    export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

    『柒』 Linux下怎麼用C++實現動態鏈接庫

    寫個
    C程序
    ,makefile
    裡面發布成一個
    動態庫
    文件,比如.so結尾的文件
    另外的程序如果要用這個so裡面的方法,編譯時候在makefile裡面增加對lib的引用,比如
    THE_INCLUDE
    =
    -I$(WORK_HOME)/include
    -I$(CRM_HOME)/include
    THE_LIBPATH
    =
    -L$(WORK_HOME)/lib
    -L$(CRM_HOME)/lib
    THE_LIB
    =
    -lConfigFile
    -lbase
    -locci10
    -lfile
    -lwsc

    『捌』 如何用qt在linux中編寫並使用動態鏈接庫

    先寫好實現動態鏈接庫的libmy.cpp文件和libmy.h文件,如下:

    // libmy.cpp

    #include"libmy.h"

    #include<iostream>

    using namespace std;
    MyLib::MyLib()
    {
    }

    MyLib::~MyLib()
    {
    }

    void MyLib::hello()
    {
    cout << "hello world~!" << endl;
    }

    // libmy.h文件

    #ifndef LIBMY_H
    #define LIBMY_H
    class MyLib

    {
    public:
    MyLib();
    ~MyLib();
    void hello();
    };
    #endif /*LIBMY_H*/

    然後寫好pro文件,如下:

    TEMPLATE = lib
    TARGET =DllTest

    HEADERS += libmy.h
    SOURCES += libmy.cpp

    保存關閉,文件名命名為MyDll.pro
    在Shell里執行qmake MyDll.pro,在沒有錯誤的情況下,然後執行make ,可以看到生成了幾個後綴名為so的文件,如下圖:

    閱讀全文

    與linux編寫動態庫相關的資料

    熱點內容
    python拼音轉換文字 瀏覽:562
    動畫遺傳演算法 瀏覽:63
    php如何解析xml文件 瀏覽:702
    如何改變appstore的語言 瀏覽:462
    javahtmlxml 瀏覽:34
    單片機啟動文件 瀏覽:811
    橙app如何開啟聊天 瀏覽:899
    訪問伺服器公網地址 瀏覽:666
    pdf列印底色去掉 瀏覽:463
    java快遞介面 瀏覽:397
    哪個app可以教新爸爸 瀏覽:210
    如何查看伺服器系統版本信息 瀏覽:524
    成都市土地出讓金演算法 瀏覽:704
    鋼筋加密標記 瀏覽:578
    ps中擴展功能在文件夾的什麼位置 瀏覽:905
    雙極壓縮機為什麼要先高壓 瀏覽:529
    蘋果手機伺服器填什麼 瀏覽:833
    android移動動畫效果 瀏覽:693
    電子和伺服器是什麼意思 瀏覽:694
    phpurl中文亂碼問題 瀏覽:894