Linux下的動態鏈接庫是.so文件,即:Shared Object,下面是一個簡單的例子說明如何寫.so以及程序如何動態載入.so中的函數和對象。
- //testso.h:
- #ifndef _TESTSO_H
- #define _TESTSO_H
- extern "C"
- {
- int myadd(int a, int b);
- typedef int myadd_t(int, int); // myadd function type
- }
- #endif // _TESTSO_H
-
-
- //testso.cpp:
- #include "testso.h"
-
- extern "C"
- int myadd(int a, int b)
- {
- return a + b;
- }
編譯so:
g++ -shared -fPIC -o testso.so testso.cpp
注意,-shared參數和-fPIC參數非常重要:
-shared 告訴gcc要生成的是動態鏈接庫;
-fPIC 告訴gcc生成的生成的代碼是非位置依賴的,方面的用於動態鏈接。
在主程序裡調用這個動態鏈接庫:
- //main.cpp:
- #include <stdio.h>
- #include <dlfcn.h>
- // for dynamic library函數
- #include "testso.h"
-
- void print_usage(void)
- {
- printf("Usage: main SO_PATH/n");
- }
-
- int main(int argc, char *argv[])
- {
- if (2 != argc) {
- print_usage();
- exit(0);
- }
-
- const char *soname = argv[1];
-
- void *so_handle = dlopen(soname, RTLD_LAZY); // 載入.so文件
- if (!so_handle) {
- fprintf(stderr, "Error: load so `%s' failed./n", soname);
- exit(-1);
- }
-
- dlerror(); // 清空錯誤信息
- myadd_t *fn = (myadd_t*)dlsym(so_handle, "myadd"); // 載入函數
- char *err = dlerror();
- if (NULL != err) {
- fprintf(stderr, "%s/n", err);
- exit(-1);
- }
-
- printf("myadd 57 + 3 = %d/n", fn(57, 3)); // 調用函數
-
- dlclose(so_handle); // 關閉so句柄
- return 0;
- }