ユーザ用ツール

サイト用ツール


shlib

動的ライブラリ

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
shlib.txt · 最終更新: 2010/06/26 06:43 (外部編集)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki