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服務