so包

zhegeMaw發表於2024-08-16

so包, 指共享庫檔案 (Shared Object)。是linux系統中提供程式碼複用功能的,透過將共享程式碼編譯成so包,方便其他程式碼中使用,從而減少記憶體佔用,提升效能。

  • 共享庫不僅在 C/C++ 中普遍使用,還能透過特定介面在其他程式語言中使用,如 Python 的 ctypes 模組和 Java 的 JNI。
  • 常用的共享庫有如標準 C 庫(libc.so)、數學庫(libm.so)等。

一、建立so包

假設我們有一個簡單的 C 程式,將其功能封裝到一個共享庫中。

1. 編寫C程式碼

建立一個名為 my_lib.c 的原始檔:
#include <stdio.h>

void hello() {
    printf("Hello from the shared library!\n");
}

2. 編譯為so包

使用 gcc 編譯上述 C 檔案並生成共享庫 libmy_lib.so
gcc -fPIC -c my_lib.c -o my_lib.o
gcc -shared -o libmy_lib.so my_lib.o
這裡的 -fPIC 表示生成位置無關程式碼(Position-Independent Code),而 -shared 表示生成共享庫。

二、跨語言使用共享庫

共享庫不僅可以在 C/C++ 中使用,還可以在其他程式語言中呼叫,例如 Python、Java 等。

Java 中使用.so檔案

使用 Java 提供的 JNI(Java Native Interface)可以呼叫共享庫

1、建立 Java 類:

public class MyLibrary {
    static {
        System.loadLibrary("my_lib");
    }

    public native void hello();

    public static void main(String[] args) {
        new MyLibrary().hello();
    }
}

2、生成標頭檔案:

javac MyLibrary.java
javah MyLibrary

3、實現本地方法

#include "MyLibrary.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_MyLibrary_hello(JNIEnv *env, jobject obj) {
    printf("Hello from the shared library!\n");
}

4、編譯共享庫

gcc -o libmy_lib.so -shared -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux MyLibrary.c

5、啟動java服務

相關文章