轉:如何用gcc編譯生成動態鏈接庫*.so文件 動態庫

轉:如何編譯.so動態庫
問:我源文件為main.c, x.c, y.c, z.c,頭文件為x.h,y.h,z.h
如何編譯成.so動態庫?
編譯器用gcc
最好能給出詳細參數解釋,謝謝

答:
# 聲稱動代連接庫,假設名稱為libtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so

# 將main.c和動態連接庫進行連接生成可執行文件
gcc main.c -L. -ltest -o main

# 輸出LD_LIBRARY_PATH環境變量,一邊動態庫裝載器能夠找到需要的動態庫
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

# 測試是否動態連接,如果列出libtest.so,那么應該是連接正常了
ldd main

# 執行就不用說了吧

-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

-L.:表示要連接的庫在當前目錄中

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

LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。
當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用
/sbin/ldconfig來達到同樣的目的,不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。

舉例:
動態鏈接庫*.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>

#include <stdlib.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、動態庫的鏈接

在1、中,我們已經成功生成了一個自己的動態鏈接庫libtest.so,下面我們通過一個程序來調用這個庫里的函數。程序的源文件為:test.c。

test.c:



#include "so_test.h"



int main()

{

? ? test_a();

? ? test_b();

? ? test_c();

? ?

? ? return 0;

}



l? ?? ?? ?將test.c與動態庫libtest.so鏈接生成執行文件test:



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



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



$ ldd test



l? ?? ?? ?執行test,可以看到它是如何調用動態庫中的函數的。
3、編譯參數解析
最主要的是GCC命令行的一個選項:
? ?? ?? ? -shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件

l? ?? ?? ?-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

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文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254321.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工業鏡頭的主要參數與選型

文章目錄簡介1、鏡頭的分類(1) 以鏡頭安裝分類(2) 以攝像頭鏡頭規格分類(3) 以鏡頭光圈分類(4) 以鏡頭的視場大小分類(5) 從鏡頭焦距上分2、選擇鏡頭的技術依據(1) 鏡頭的成像尺寸(2) 鏡頭的分辨率(3) 鏡頭焦距與視野角度(4) 光圈或通光量3、變焦鏡頭&#xff08;zoom lens&…

SQLSEVER 中的那些鍵和約束

SQL Server中有五種約束類型&#xff0c;各自是 PRIMARY KEY約束、FOREIGN KEY約束、UNIQUE約束、DEFAULT約束、和CHECK約束。查看或者創建約束都要使用到 Microsoft SQL Server Managment Studio。1. PRIMARY KEY約束 在表中常有一列或多列的組合&#xff0c;其值能唯一標識表…

數據庫 sqlite 進階

http://www.cppblog.com/czy463/archive/2013/12/16/204816.html 董淳光 前序&#xff1a; Sqlite3 的確很好用。小巧、速度快。但是因為非微軟的產品&#xff0c;幫助文檔總覺得不夠。這些天再次研究它&#xff0c;又有一些收獲&#xff0c;這里把我對 sqlite3 的研究列出來&a…

形象的列舉-C# 枚舉

文章目錄簡介例子分析點撥博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 簡介 枚舉類型用于聲明一組命名常數。 定義枚舉類型語法格式如下&#xff1a;enum 枚舉數組名{枚舉成員列表};例如&#xff1a; enum week{星期一&#xff0c;星期二…

Confluence 6 手動備份站點

2019獨角獸企業重金招聘Python工程師標準>>> Confluence 被配置自動備份數據&#xff0c;使用壓縮的 XML 格式。同時你也可以通過 Confluence 的 管理員控制臺&#xff08;Administration Console&#xff09;手動進行備份。 你需要具有 System Administrator 權限才…

編寫高質量的Makefile

分類&#xff1a; c/c研究 GNU&amp;LINUX2010-09-12 15:31163人閱讀 評論(0)收藏舉報源地址 &#xff1a;http://acm.hrbeu.edu.cn/forums/index.php?showtopic1827&st0&gopid8924&#entry8924 一、前言 回想自己的第一個Makefile&#xff0c;是這個樣子的 …

第六篇:python基礎之文件處理

第六篇&#xff1a;python基礎之文件處理 閱讀目錄 一.文件處理流程二.基本操作2.1 文件操作基本流程初探2.2 文件編碼2.3 文件打開模式2.4 文件內置函數flush2.5 文件內光標移動2.6 open函數詳解2.7 上下文管理2.8 文件的修改一.文件處理流程 打開文件&#xff0c;得到文件句柄…

前端每日實戰:56# 視頻演示如何用純 CSS 描述程序員的生活

效果預覽 按下右側的“點擊預覽”按鈕可以在當前頁面預覽&#xff0c;點擊鏈接可以全屏預覽。 https://codepen.io/comehope/pen/YvYVvY 可交互視頻 此視頻是可以交互的&#xff0c;你可以隨時暫停視頻&#xff0c;編輯視頻中的代碼。 請用 chrome, safari, edge 打開觀看。 ht…

從特殊到一般-C#中的類

文章目錄類的概念類的定義實例例子分析類的成員數據成員屬性成員方法成員靜態成員博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 類的概念 在日常生活中&#xff0c;類是對具有相同特性的一類是物的抽象。比如水果是一個類&#xff0c;它是對…

Chapter 1 First Sight——30

The girl sitting there giggled. Id noticed that his eyes were black — coal black. 那個坐在那里的女孩笑著。我注意到她的眼睛是很色的--炭黑色的。 Mr. Banner signed my slip and handed me a book with no nonsense about introductions. Banner 先生簽了我的名字然后…

GPU 與CPU的作用協調,工作流程、GPU整合到CPU得好處

在不少人的心目中&#xff0c;顯卡最大的用途可能就只有兩點——玩游戲、看電影&#xff0c;除此之外&#xff0c;GPU并沒有其他的作用了。但是隨著微軟IE9的正式發布&#xff0c;不少人突然發現&#xff0c;微軟一直提到一個名詞&#xff1a;GPU硬件加速&#xff0c;從而也讓不…

[luoguP1029] 最大公約數和最小公倍數問題(數論)

傳送門 一.暴力枚舉&#xff08;加了點優化&#xff09; #include <cstdio>int x, y, ans;inline int gcd(int x, int y) {return !y ? x : gcd(y, x % y); }inline int lcm(int x, int y) {return x / gcd(x, y) * y; }int main() {int i, j;scanf("%d %d", …

CPU和GPU擅長和不擅長的方面

從它們執行運算的速度與效率的方面來探討這個論題。CPU和GPU都是具有運算能力的芯片&#xff0c; CPU更像“通才”——指令運算(執行)為重數值運算&#xff0c; GPU更像“專才”——圖形類數值計算為核心。在不同類型的運算方面的速度也就決定了它們的能力——“擅長和不擅長”…

一些IO流的知識

IO流&#xff1a; 輸入流&#xff1a;輸出流&#xff1a; 字節流&#xff1a;字符流&#xff1a;為了處理文字數據方便而出現的對象。 其實這些對象的內部使用的還是字節流(因為文字最終也是字節數據) 只不過&#xff0c;通過字節流讀取了相對應的字節數&#xff0c;沒有對這些…

為人示弱,做事留余 | 摸魚系列

我很喜歡結交有很好的自然觀察能力的朋友&#xff0c;這是種對周圍環境和文化的洞察力。 一方面的原因是優秀的領導者、企業家和投資人能利用這種能力發現新市場&#xff0c;預測新潮流&#xff0c;設計出有效的市場營銷活動&#xff0c;并找到需要重點關注的人群。 另一方面&a…

從一般到特殊-C#中的對象

文章目錄對象的概念對象的創建和使用匿名類型和初始化器構造函數和析構函數構造函數析構函數范例參數傳遞博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 對象的概念 類是具有相同特征一類事物的抽象&#xff0c;而對象是類的實例。 類和對象…

如何用面對對象來做一個躁動的小球?

今天來看看怎樣用面對對象來做一個躁動的小球。 首先我們先創建一個對象&#xff0c;他的屬性包含小球的隨機水平、縱向坐標&#xff0c;隨機寬、高&#xff0c;隨機顏色&#xff0c;以及創建小球的方法。 html: <div id"wrap"></div> js:function Boll(…

關于MyEclipse項目的名字的修改對項目導入導出的影響

不要修改項目名字&#xff0c;不管是在MyEclipse中(.project文件里面的額name會變)還是在G:\MyEclipseData目錄下(.project文件里面的額name不會變)&#xff0c;否則導入的時候不能訪問&#xff0c;會出現400的錯誤&#xff0c;而訪問的網址必須是以前沒改名前的那個名字才可以…

Gcc詳解以及靜態庫、動態庫生成

[轉] Gcc詳解以及靜態庫、動態庫生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1。gcc包含的c/c編譯器 gcc,cc,c,g,gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;(沒有看太明白前面這半句是什 么意思:))一般c程序就用gcc編譯&#xff0c;c程序…

改變世界的七大NLP技術,你了解多少?(上)

什么是NLP&#xff1f; 自然語言處理&#xff08;NLP&#xff09; 是計算機科學&#xff0c;人工智能和語言學的交叉領域。目標是讓計算機處理或“理解”自然語言&#xff0c;以執行語言翻譯和問題回答等任務。 隨著語音接口和聊天機器人的興起&#xff0c;NLP正在成為信息時代…