請問我有 so檔案,如何在Linux下程式設計使用呢

時間 2021-08-15 23:18:29

1樓:大野瘦子

-lxx

xx是你的.so檔名

其實使用方法和你使用數學庫函式是一樣的,源**中新增

#include ,編譯的時候,加上-lm引數。

注:linux下的.so檔案為共享庫,相當於windows下的dll檔案。

linux下編寫呼叫so檔案例項

.so是linux(unix)下的動態連結庫. 和.dll類似.

比如:檔案有: a.c, b.c, c.c

gcc -c a.c

gcc -c b.c

gcc -c c.c

gcc -shared lib***.so a.o b.o c.o

要使用的話也很簡單. 比如編譯d.c, 使用到lib***.so中的函式, lib***.so地址是mypath

gcc d.c -o d -lmypath -l***

注意不是-llib***

test.c檔案和一個test.h,這兩個檔案要生成libsotest.

so檔案。然後我還有一個testso.c檔案,在這個檔案裡面呼叫libsotest.

so中的函式。

編寫的過程中,首先是編譯so檔案,我沒有編寫makefile檔案,而是參考的2裡面說的直接寫的gcc命令。

因為so檔案裡面沒有main函式,所以是不可執行的,所以編譯的時候要加上-c,只生成目標檔案。

2樓:

linux下的.so是基於linux下的動態連結,其功能和作用類似與windows下.dll檔案。

下面是關於.so的介紹:

一、引言

通常情況下,對函式庫的連結是放在編譯時期(compile time)完成的。所有相關的物件檔案(object file)與牽涉到的函式庫(library)被連結合成一個可執行檔案(executable file)。程式在執行時,與函式庫再無瓜葛,因為所有需要的函式已拷貝到自己門下。

所以這些函式庫被成為靜態庫(static libaray),通常檔名為「lib***.a」的形式。

其實,我們也可以把對一些庫函式的連結載入推遲到程式執行的時期(runtime)。這就是如雷貫耳的動態連結庫(dynamic link library)技術。

二、動態連結庫的特點與優勢

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

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

什麼概念呢?就是說,某個程式的在執行中要呼叫某個動態連結庫函式的時候,作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才連結載入。

這樣的模式雖然會帶來一些「動態連結」額外的開銷,卻大大的節省了系統的記憶體資源。c的標準庫就是動態連結庫,也就是說系統中所有執行的程式共享著同一個c標準庫的**段。

2. 將一些程式升級變得簡單。使用者只需要升級動態連結庫,而無需重新編譯連結其他原有的**就可以完成整個程式的升級。windows 就是一個很好的例子。

3. 甚至可以真正坐到連結載入完全由程式設計師在程式**中控制。

程式設計師在編寫程式的時候,可以明確的指明什麼時候或者什麼情況下,連結載入哪個動態連結庫函式。你可以有一個相當大的軟體,但每次執行的時候,由於不同的操作需求,只有一小部分程式被載入記憶體。所有的函式本著「有需求才調入」的原則,於是大大節省了系統資源。

比如現在的軟體通常都能開啟若干種不同型別的檔案,這些讀寫操作通常都用動態連結庫來實現。在一次執行當中,一般只有一種型別的檔案將會被開啟。所以直到程式知道檔案的型別以後再載入相應的讀寫函式,而不是一開始就將所有的讀寫函式都載入,然後才發覺在整個程式中根本沒有用到它們。

三、動態連結庫的建立

由於動態連結庫函式的共享特性,它們不會被拷貝到可執行檔案中。在編譯的時候,編譯器只會做一些函式名之類的檢查。在程式執行的時候,被呼叫的動態連結庫函式被安置在記憶體的某個地方,所有呼叫它的程式將指向這個**段。

因此,這些**必須實用相對地址,而不是絕對地址。在編譯的時候,我們需要告訴編譯器,這些物件檔案是用來做動態連結庫的,所以要用地址不無關**(position independent code (pic))。

對gcc編譯器,只需新增上 -fpic 標籤,如:

gcc -fpic -c file1.c

gcc -fpic -c file2.c

gcc -shared lib***.so file1.o file2.o

注意到最後一行,-shared 標籤告訴編譯器這是要建立動態連結庫。這與靜態連結庫的建立很不一樣,後者用的是 ar 命令。也注意到,動態連結庫的名字形式為 「lib***.

so」 字尾名為 「.so」

四、動態連結庫的使用

使用動態連結庫,首先需要在編譯期間讓編譯器檢查一些語法與定義。

這與靜態庫的實用基本一樣,用的是 -lpath 和 -l*** 標籤。如:

gcc file1.o file2.o -lpath -l*** -o program.exe

setenv ld_library_path   your/full/path/to/dll

一切安排妥當後,你可以用 ldd 命令檢查是否連線正常。

ldd program.exe

動態連結庫*.so的編譯與使用- -

動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在**找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。

1、動態庫的編譯

下面通過一個例子來介紹如何生成一個動態庫。這裡有一個標頭檔案:so_test.

h,三個.c檔案:test_a.

c、test_b.c、test_c.c,我們將這幾個檔案編譯成一個動態庫:

libtest.so。

so_test.h:

#include   "stdio.h"

void test_a();

void test_b();

void test_c();

test_a.c:

#include "so_test.h"

void test_a()

printf("this is in test_a.../n");

test_b.c:

#include "so_test.h"

void test_b()

printf("this is in test_b.../n");

test_a.c:

#include "so_test.h"

void test_c()

printf("this is in test_c.../n");

將這幾個檔案編譯成一個動態庫:libtest.so

$ gcc test_a.c test_b.c test_c.c -fpic -shared -o libtest.so

2、動態庫的連結

test.c:

#include "so_test.h"

int main()

test_a();

test_b();

test_c();

return 0;

$ gcc test.c -l. -ltest -o test

l 測試是否動態連線,如果列出libtest.so,那麼應該是連線正常了

$ ldd test

l 執行test,可以看到它是如何呼叫動態庫中的函式的。

3、編譯引數解析

最主要的是gcc命令列的一個選項:

-shared 該選項指定生成動態連線庫(讓聯結器生成t型別的匯出符號表,有時候也生成弱連線w型別的匯出符號),不用該標誌外部程式無法連線。相當於一個可執行檔案

l -l.:表示要連線的庫在當前目錄中

l -ltest:編譯器查詢動態連線庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱

l ld_library_path:這個環境變數指示動態聯結器可以裝載動態庫的路徑。

l 當然如果有root許可權的話,可以修改/etc/ld.so.conf檔案,然後呼叫 /sbin/ldconfig來達到同樣的目的,不過如果沒有root許可權,那麼只能採用輸出ld_library_path的方法了。

4、注意

呼叫動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的標頭檔案所在目錄 通過 「-i」 include進來了,庫所在檔案通過 「-l」引數引導,並指定了「-l」的庫名,但通過ldd命令察看時,就是死活找不到你指定連結的so檔案,這時你要作的就是通過修改 ld_library_path或者/etc/ld.so.conf檔案來指定動態庫的目錄。

通常這樣做就可以解決庫無法連結的問題了。

3樓:鯤之大一鍋燉不下化而為鳥其名為鵬

安裝個開發工具 然後編譯就行了 redhat在安裝的時候選擇自定義就可以安裝開發工具 make 然後make install

4樓:擁雲莊主

linux下的.so檔案為共享庫,相當於windows下的dll檔案,使用方法如下:

在你的工程源**裡包含.h標頭檔案,然後可以呼叫動態庫裡的函式,在連結的時候加上如下編譯器引數:

-l xx.so

如果你的so檔案是以lib開頭的,還可以直接這樣使用:

-lxx

xx是你的.so檔名

其實使用方法和你使用數學庫函式是一樣的,源**中新增#include ,編譯的時候,加上-lm引數。

5樓:213456俺說的

動態連結庫,呼叫,寫c語言時用的。放在編譯的資料夾裡面。包含進去.h就行了、、、、、、、、

6樓:匿名使用者

*.so 就是linux 下的動態連結庫,具體:

7樓:匿名使用者

你去查查動態連結庫怎麼使用吧,我只懂c語言,這個不太瞭解。

linux系統下如何安裝軟體,如何在Linux系統中安裝應用軟體

一般用命行,或新立得軟體包管理器 系統 系統管理 新立得軟體包管理器 這樣可以自動解決以來關係。如果是 deb可以雙擊直接安裝。rpm可能需要先安裝rpm包。tar,gz,tar.bz等需先解壓,用cd命令進入資料夾。configure make 如果make失敗,先執行一下sudo apt get...

如何在虛擬機器Linux下安裝軟體

rpm ivh openoffice.org3 zh.rpm 虛擬機器上安裝linux,讓學習起來更方便。如何在虛擬機器的linux系統上安裝軟體 vmware 虛擬機器安裝linux系統 先安裝虛擬機器這個軟體,然後在虛擬機器裡裝linux。2,安裝vm虛擬機器,開啟vm安裝包,設定安裝路徑,按照...

如何把檔案放到虛擬機器linux路徑下

幻翼高達 1 首先,連線相應linux主機,進入到linux命令列狀態下,進入到指定路徑下。2 在windows共享目錄下建立新檔案,例如 test1.txt。3 最後,回到linux命令列頁面,再次輸入ls指令發現,新建立的test1.txt已經通過共享目錄放到了虛擬機器指定目錄下。 迪蒙智慧交通...