1. 程式人生 > >做一個動態連結庫

做一個動態連結庫

寫此文的目的是驗證將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 1031 11:46 ./
drwx------ 7 linc linc  4096 1020 20:06 ../
-rwxrwxr-x 1 linc linc  8251 1031 11:46 libshooter.so*
-rw-rw-r-- 1 linc linc   469 1031 11:32 shooter.c
-rw------- 1 linc linc   137 1031 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缺失都是小事,直接下載然後放到相應的目錄下就可以了,但是這個問題我嘗試了很多次才解決,特地記錄下來