C言語(gcc)で動的ライブラリ(shlib)を実装し、C言語およびPython言語から呼び出す例を示す。
資料
cygwin gcc 4.3.4 および python 2.5.2 で動作を確認した。
# Makefile target: libmystuff main libmystuff: gcc -fPIC -g -c -Wall a.c gcc -fPIC -g -c -Wall b.c gcc -fPIC -g -c -Wall str.c gcc -shared -Wl,-soname,libmystuff.so.1 -o libmystuff.so.1.0.1 a.o b.o str.o -lc main: main.c gcc main.c -o main -ldl
/* a.c */ int a(int x, int y) { return x + y; }
/* b.c */ int b(int x, int y) { return x - y; }
/* str.c */ #include <string.h> char *cat(char *a, char *b) { return strcat(a, b); }
/* main.c */ #include <stdlib.h> #include <stdio.h> #include <dlfcn.h> #include <string.h> int main(void) { void *handle; int (*func_a)(int, int); int (*func_b)(int, int); char *(*func_cat)(char *, char *); char *error; char buf1[10], buf2[10]; handle = dlopen("libmystuff.so.1.0.1", RTLD_LAZY); if (!handle) { fputs (dlerror(), stderr); exit(1); } func_a = dlsym(handle, "a"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } func_b = dlsym(handle, "b"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } func_cat = dlsym(handle, "cat"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } printf("a %d\n", (*func_a)(3,2)); printf("b %d\n", (*func_b)(3,2)); strcpy(buf1, "a"); strcpy(buf2, "b"); printf("cat %s\n", (*func_cat)(buf1, buf2)); dlclose(handle); return 0; }
# main.py from ctypes import * h = cdll.LoadLibrary("libmystuff.so.1.0.1") print h.a(3,2) print h.b(3,2) s1 = create_string_buffer('a', 10) print c_char_p(h.cat(s1,'b')).value