1. 程式人生 > >linux c/c++ 動態庫開發例項

linux c/c++ 動態庫開發例項

windows中使用__declspec(dllexport)來將函式匯出類似宣告的.def檔案,linux中是不需要的,因為它將函式全部匯出

動態庫靜態庫使用

樣本程式碼
test.h

#ifndef __TEST_LIB
#define __TEST_LIB
void foo();
#endif
test.cpp
#include "test.h"
#include <iostream>
using namespace std;
void foo()
{
    cout<<"hello, i am c++!"<<endl;
}
main.cpp
#include "test.h"
#include <iostream>
using namespace std;
int main()
{
    foo();
    return 0;
}
編譯靜態庫
g++ -c -o test.o test.cpp
ar cr libtest_s.a test.o
g++ -o run_s main.cpp -L. -ltest_s

這裡可以嘗試刪除libtest_s.a也是可以執行的

編譯動態庫

g++ -shared -fPIC -o libtest_d.so test.cpp
g++ -o run_d main.cpp -L. -ltest_d
需要執行,還需要修改環境變數LD_LIBRARY_PATH, export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
如果需要在mac執行還需要DYLD_LIBRARY_PATH
如果刪除對應的.so庫,執行就出錯

“PCI”命令列標記告訴GCC產生的程式碼不要包含對函式和變數具體記憶體位置的引用,這是因為現在還無法知道使用該訊息程式碼的應用程式會將它連線到哪一段記憶體地址空間。這樣編譯出的bill.o可以被用於建立共享連結庫。建立共享連結庫只需要用GCC的”-shared”標記即可。
如果不加-fPIC,則載入.so檔案的程式碼段時,程式碼段引用的資料物件需要重定位, 重定位會修改程式碼段的內容,這就造成每個使用這個.so檔案程式碼段的程序在核心裡都會生成這個.so檔案程式碼段的copy.每個copy都不一樣,取決於這個.so檔案程式碼段和資料段記憶體對映的位置,相當於沒有使用共享庫的優勢.

檢視函式簽名

[[email protected] dylib]# nm ./libtest_s.a|grep foo
0000006c t _GLOBAL__I__Z3foov
00000000 T _Z3foov
[[email protected] dylib]# nm ./libtest_d.so|grep foo
000006bc t _GLOBAL__I__Z3foov
00000650 T _Z3foov
檢視動態庫依賴
[[email protected] dylib]# ldd ./run_s
	linux-gate.so.1 =>  (0x00b04000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00957000)
	libm.so.6 => /lib/libm.so.6 (0x002fd000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00814000)
	libc.so.6 => /lib/libc.so.6 (0x00140000)
	/lib/ld-linux.so.2 (0x0011a000)
[
[email protected]
dylib]# ldd ./run_d linux-gate.so.1 => (0x00513000) libtest_d.so => ./libtest_d.so (0x0068f000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00957000) libm.so.6 => /lib/libm.so.6 (0x002fd000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00814000) libc.so.6 => /lib/libc.so.6 (0x00140000) /lib/ld-linux.so.2 (0x0011a000)



相關推薦

linux c/c++ 動態開發例項

windows中使用__declspec(dllexport)來將函式匯出類似宣告的.def檔案,linux中是不需要的,因為它將函式全部匯出 動態庫靜態庫使用 樣本程式碼 test.h #ifndef __TEST_LIB #define __TEST_LIB void

LinuxC程式動態的生成和呼叫

Linux下C程式動態庫的生成和呼叫 文章目錄 Linux下C程式動態庫的生成和呼叫 1 動態庫的打包和呼叫 2 靜態庫打包和呼叫 3 常用命令 4 gcc 和 g++ 區別 5 編譯和連結的理解

Linux連結三(CC++之間動態的相互呼叫)

http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http://www.jb51.net/article/34990.htm extern "C"的理解: 很多人認

Java調用c程序動態詳細案例

mic fan 調用 c程序 案例 href java pid blank 1n閡嚎o指N階墑06灰tjhttp://huiyi.docin.com/arg9509 N19u4wTfnd塵2http://shufang.docin.com/fbqja96992 84稭棧

C# 調用 C++/CLI (托管模式c++) 的動態(DLL)

C++/CLI C# Dll調用 1.創建C++/CLI的動態庫 添加類 右鍵生成後即可生成 CLI_Dll.dll2.創建C#窗口應用程序,引用CLI_Dll.dll,然後就可以像是調用C#生成的的dll調用CLI_Dll.dll。C# 調用 C++/CLI (托管模式c++) 的動態庫(D

C#+NPOI動態 對Word的簡單編輯

眾裡尋他千百度,終回首,就在燈火闌珊處。 在很多人部落格上看見基於NPOI動態庫對word進行讀寫,但是沒有自己想要的效果(很多部落格都是對word中的表格做操作,這很正常,NPOI的官方使用文件從頭到尾的都是在講對Excel的操作),於是乎自己摸索了一個。在這裡覺得最最最重要的東

C++載入動態的形式來實現封裝

目錄結構 └── test ├── CMakeLists.txt ├── base.h //設定介面 ├── drive.cpp //具體實現 └── main.cpp

C語言動態建立方法,以及和python混合程式設計

這篇小結是2016年暑假在新疆出差階段所寫,因為專案需要所以研究了一下。 如有錯誤,歡迎互相交流。 不同編譯器實現python呼叫C語言動態庫方法小結 Windows平臺下Visual Studio 2010編譯器建立動態庫,並呼叫 第一步:建立動態dll動態庫

C++編寫動態.so或者.dll的陷阱

一、介面不變就可以不需要重新編譯? 對於很多庫的實現者可能會有這樣的認識“介面不變就可以不需要重新編譯”,其實這句話是有前提的,前提是實現的動態庫有足夠的相容性和魯棒性。尤其是C++實現的動態庫,C++只對語言層規則做了規定,沒有二進位制級別的任何規定。 COM本質論裡面的

Unity3d 載入 C++/CLI (託管模式c++) 的動態(DLL)

由於最近開發遊戲尋路A*使用非常頻繁.所以是邏輯上的瓶頸. c#又比c++慢一倍.所以決定上c++.這樣算一種優化吧.哈哈. 關於vs上的vc++.分託管和非託管模式.  託管模式就是 C++/CLI 也就說可以c++使用.net庫. 和 CLR是一起的.  還有就是 非託

c動態

程式編譯一般需經預處理、編譯、彙編和連結幾個步驟。在應用中,有一些公共程式碼是需要反覆使用,就把這些程式碼編譯為“庫”檔案;在連結步驟中,聯結器將從庫檔案取得所需的程式碼,複製到生成的可執行檔案中。這種庫稱為靜態庫,其特點是可執行檔案中包含了庫程式碼的一份完整拷貝;缺點就是

python呼叫C語言動態

python完美相容C語言,有了ctypes 可以呼叫c相關程式碼  如果是c++程式碼   編譯的時候加上 extern "C" 就可以了 ,如果是一些複雜型別比如結構體,類,聯合一些 可以考慮用boost.python exp.c #include <stdio

c++檢視動態中函式地址

我們知道在生成動態庫時,如果使用.def檔案.那麼可以在.def中定義函式地址即例: add @1這種方式.但畢竟這是一種取巧的方式,如果你想獲得任何一個動態庫中函式地址,那麼我這邊可以提供兩個方法.(1)使用vs自帶的功能我用的是VS2005開啟工具選項,下面有Visual

VS中C++靜態/動態檔案的編譯除錯與使用

基礎知識:不同語言之間可以通過呼叫動態連結庫 (dll)來呼叫別人寫好的函式同一語言可以呼叫別人寫好的靜態(lib)庫靜態連結庫:是通過靜態聯編的,在連結時,link將自己的(.obj)二進位制檔案和別人的lib檔案一起共同生成.exe檔案。 靜態連結庫的缺點是: 1)比較

c++呼叫動態的方法

一、建立動態庫(vs2013)    可以建立一個空的c++專案,寫好庫裡的函式;最後在編譯時,生成動態庫,我這裡隨便寫了個函式 然後右鍵專案名,選擇“屬性”,“常規”,“配置型別”改成“動態庫(.dll)”如圖: 再點選生成即可生成動態庫 二、呼叫動態庫 1、建立一個

C++中動態(.dll)和靜態(.lib)

最近,做一些程式的封裝,就瞭解了C++中封裝動態庫(.dll)和靜態庫(.lib)的方法,以及兩種庫呼叫時異同,現在記錄下,後續有新的理解,會繼續更新; 動態庫(.dll):動態庫又稱動態連結庫英文為

C++ 的websocket的開發例項

#!/bin/sh # wget http://git.warmcat.com/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.4-chrome43-firefox-36.tar.gz # tar xvzf libweb

linux和windows動態加載路徑區別

usr 路徑 推薦 div inux 但是 blog 區別 window # linux和windows動態庫加載路徑區別 ### 簡介------------------------------ linux加載動態庫的路徑是系統目錄/lib和/usr/lib。- win

linux建立靜動態

1.gcc編譯選項 -E : 預處理 .c -> .i -S : 編譯 .i /.c -> .s -c : 彙編 .s -> .o -g : 生成除錯資訊 -O : 優化級別 -O0 -O1 -O2 -O3 -Os -I : 包含一個頭檔案搜尋路徑 -I/home/li

再談Linux下的動態

為了解決上一篇的部落格《Linux下靜態庫、動態庫的建立和使用》最後留下的問題,今天總結一下Linux下動態庫 版本號的控制。 一、動態庫版本號的組成     對於上一篇部落格中提到的庫檔案libcurl.4.3.0,其中4代表主版本號,3代表次版本號,0代表發