做一個動態連結庫
寫此文的目的是驗證將C程式碼編譯成so,隨後將其放到Android平臺供上層應用呼叫。這個庫的名稱為shooter。
動態連結庫也叫共享庫(shared object),將原始碼編譯成二進位制檔案,在程式執行時動態的載入它。我們會把一些常用的通用的方法做成庫以so的形式釋出,
好處是有效的知識管理和有效的隱私保護。
libshooter.so
目前shooter只暴露一個A方法,標頭檔案shooter.h如下:
//so demo
#ifndef SHOOTER_H
#define SHOOTER_H
#ifdef __cplusplus
extern "C" {
#endif
int A(int a);
#endif
A方法完成了在1到100的是個隨機數中找出最小的那個返回。
原始檔shooter.c如下:
#include "shooter.h"
#include "time.h"
#include <stdio.h>
void bubble_sort(int *array,int n) {
int i,j,tmp;
for(i=0;i<n-1;i++) {
for(j=n-1;j>i;j--) {
if(array[j-1]>array[j]) {
tmp = array [j-1];
array[j-1]=array[j];
array[j]=tmp;
}
}
}
}
int A(int a) {
int n = 10;
int array[n],i;
srand(time(NULL));//隨機種子
for(i=0;i<n;i++) {
array[i] = rand()%100+1;//1~100內隨機數
printf("%d, ",array[i]);
}
printf("\n" );
bubble_sort(array,n);
return array[0];
}
將其編譯成so庫。作業系統為ubuntu 14.04,gcc版本為4.8.4
$ gcc -c -fPIC -o shooter.o shooter.c
$ gcc -shared -o libshooter.so shooter.o
$ ll
total 76
drwx------ 2 linc linc 4096 10月 31 11:46 ./
drwx------ 7 linc linc 4096 10月 20 20:06 ../
-rwxrwxr-x 1 linc linc 8251 10月 31 11:46 libshooter.so*
-rw-rw-r-- 1 linc linc 469 10月 31 11:32 shooter.c
-rw------- 1 linc linc 137 10月 31 11:22 shooter.h
測試其功能
新建shooter_tester.c呼叫此so的方法,驗證其功能。
#include <stdio.h>
#include "shooter.h"
int main() {
int result = A(0);
printf("A result: %d\n",result);
return 0;
}
編譯執行:
$ gcc -o shooter_tester shooter_tester.c -lshooter -L.
$ ./shooter_tester
./shooter_tester: error while loading shared libraries: libshooter.so: cannot open shared object file: No such file or directory
還是沒有找到so檔案:
$ ldd shooter_tester
linux-vdso.so.1 => (0x00007ffea5997000)
libshooter.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f47715bb000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4771980000)
解決辦法參考網友Vamei(第三個連結):
$ gcc -o shooter_tester shooter_tester.c -lshooter -L. -Wl,-rpath=.
$ ./shooter_tester
92, 6, 79, 33, 32, 24, 93, 79, 44, 22,
A result: 6
庫已建好,等你來用!Shooter!
相關推薦
做一個動態連結庫
寫此文的目的是驗證將C程式碼編譯成so,隨後將其放到Android平臺供上層應用呼叫。這個庫的名稱為shooter。 動態連結庫也叫共享庫(shared object),將原始碼編譯成二進位制檔案,在程式執行時動態的載入它。我們會把一些常用的通用的方法做成庫以
Windows下用Codeblocks建立一個最簡單的DLL動態連結庫
建立一個最簡單的只有一個get_id() 函式的DLL庫 一、建立C語言動態連結庫 1.新建一個動態庫的工程 File - New - Project - DLL - Go 新建的工程原來的main.cpp和main.h刪除,新建兩個檔案simple.
建立一個MFC動態連結庫
還沒好好的學習一下MFC,之前學過一段時間的QT,現在發現MFC與QT其實很相似,都很詳細的提供了介面庫,可能在具體的細節方面有不同吧,等著去發現。 一、建立DLL檔案 1、新建工程檔案
【Android】動態連結庫so的載入原理
前言 最近開發的元件時常出現了執行時載入so庫失敗問題,每天都會有java.lang.UnsatisfiedLinkError的錯誤爆出來,而且線上總是偶然復現,很疑惑。所以本文將從AOSP原始碼簡單跟蹤Android中的動態連結庫so的載入原理,試圖找出一絲線索。 載入入口
使用JNI開啟底層裝置是報錯,需要看看.so動態連結庫檔案是否編譯到APK裡面
這是因為動態連結庫沒有編譯到APK,所以要在build.gradle檔案裡配置 jniLibs.srcDirs = ['libs'] sourceSets { main { manifest.srcF
(轉)靜態編譯,動態編譯,靜態連結庫,動態連結庫
1.定義 LIB檔案中包含函式程式碼本身,在編譯時直接將程式碼加入程式當中。稱為靜態連結庫static link library。 LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link libr
C語言函式庫:動態連結庫與靜態連結庫
首先,函式庫就是一些事先寫好的函式的集合,是別人分享的,我們可以拿來使用的。經過一些校準和整理,就形成一份標準化的函式庫。例如glibc 函式庫有兩種提供形式:動態連結庫與靜態連結庫 早起函式庫裡的函式都是直接共享的,就是所謂的開源社群。後來函式庫商業化,就出現了靜態連結庫與動態連結庫。
靜態連結庫的編譯與使用 linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用
linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用 知識不等於技術,這句話真的是越工作的時間長越深有體會,學習到的知識只有不斷的實踐,才成真正在自已的心裡紮下根,成為自身的一部分,所以無論如何,我希望我的部落格可以
一步步完善rootfs:4.配置動態連結庫
配置動態連結庫 一、動態連結庫作用 編譯程式可分為動態編譯和靜態編譯,靜態編譯出來的可執行程式大小相比較於動態編譯是很大的,所以為了縮小程式所佔的資源,一般使用動態編譯,動態編譯的程式在執行時會依賴動態連結庫去執行,動態連結庫會提供API給程式呼叫。 二、查詢動態連結庫 動態
採用dlopen、dlsym、dlclose載入動態連結庫【總結】
https://blog.csdn.net/qq_19399235/article/details/62579386 https://blog.csdn.net/shaosunrise/article/details/81161064 https://www.cnblogs.com/
python中呼叫 C#動態連結庫問題記錄
程式[摘自https://blog.csdn.net/LTG01/article/details/80700513] import clr clr.FindAssembly("PythonNetTest.dll") ## 載入c#dll檔案 from PythonNetTest import *
使用Netbeans編譯C++檔案,動態連結庫的方法
一鍵執行時會出現類似於下面的錯誤: Undefined symbols for architecture x86_64: "___gmp_printf", referenced from: _main in main.o "_
無法定位程式輸入點ucrtbase.terminate於動態連結庫api-ms-win-crt-runtime-|1-1-0.dl
問題: 本人在安裝完office16 後使用Q-Dir軟體的時候彈出瞭如下提示: 解決辦法: (win7 sp0升級為sp1,然後升級補丁kb2999226,最後安裝VC2015) api-ms-win-crt-runtime-1-1-0.dll是VC
在動態連結庫中匯出介面類
介面類匯出的一般是void *型別的指標;在使用的工程中將其轉換為介面類指標,然後使用。 今天碰到無法開啟原始檔ui_ .h。應為介面類使用Qt Designer建立了一個介面(在VS環境下不是指標) 1、在使用庫的工程中新增,ui_ .h檔案所在目錄; 可能遇到一些別的標頭檔案
關於原始檔,標頭檔案,靜態連結庫檔案,動態連結庫檔案的的理解
先從原始檔和標頭檔案的關係說起,由於是還是初學階段,只接觸了C++語言和windows平臺下的程式設計,所以只講這兩方面的東東, 標頭檔案的作用:對函式,變數,和類的宣告,其實在標頭檔案也可對一些特殊函式和變數定義,比如可以在標頭檔案中對行內函數和const型別變數定義,由於對類的宣告
C#生成/呼叫動態連結庫
參考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html 一、需求描述 (1)用程式碼生成動態連結庫 (2)用C#程式碼呼叫動態連結庫 二、生成動態連結庫 (
GCC編譯過程與動態連結庫和靜態連結庫(未整理)
來源:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6410588.html 根據連結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在連結階段被連結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時
python3使用ctypes在windows中訪問C和C++動態連結庫函式示例
python3使用ctypes在windows中訪問C和C++動態連結庫函式示例 這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫 一 測試環境介紹和準備 測試環境: 作業系統:windows10 Python版本:3.7.0 VS版本:vs2015社群版(免費) 相關
編譯32位windows系統下可用的JVMTI動態連結庫
這3天研究如何編譯32位windows系統下可用的jVMTI動態連結庫。中間過程很多時間都在搭建各種環境,其他時間在學習編譯和各個系統的相關知識,總的來說,受益匪淺。記錄一下3天踩過的坑和解決方法。
win7下無法定位程式輸入點ucrtbase.abort與動態連結庫api-ms-win-crt-runtime-l1-1-0.dll上解決辦法
前言 由於最近在搭漏洞環境,想在我的win7虛擬機器下配一下wamp環境,出於便利我想使用wampserver這一整合開發環境,但是在安裝過程中遇到了好多問題(各種dll的缺失),dll缺失都是小事,直接下載然後放到相應的目錄下就可以了,但是這個問題我嘗試了很多次才解決,特地記錄下來