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.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;
}
下面是一个简单的例子说明如何写.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.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;
}