Ключевые слова:share, lib, example, module, (найти похожие документы)
Date: Wed, 24 Apr 2002 16:07:05 +0000 (UTC)
From: Valentin Nechayev <netch@segfault.kiev.ua>
Newsgroups: fido7.ru.unix.prog
Subject: Модульные программы, подключение модулей в виде SO библиотеки.
> Вот вижу сейчас многие пишут программы с поддержкой модулей
> - например oops. Вот у меня и возник вопрос: как вообще такое
> делается :)? Если можно на примере - желательно простом.
Модуль чаще всего делается как shared object (.so) или аналогичное средство
других систем (DLL в винде, etc.), с набором входных точек с заранее
определенными именами или иными индексами. Загружать его надо через
dlopen() или аналогично для других систем, затем спрашивать (dlsym)
адреса функций и явно их вызывать. (RTLD_GLOBAL не ставить!
разве что модуль одного типа у тебя всегда только один)
Когда вызывать, какие отношения между модулями - определяется
приложением; никаких общих рецептов дать заранее нельзя. Некоторые продукты
позволяют строить цепочки и стеки из действий, выполняемых модулями...
это опять же все внутренние особенности.
Ну а насчет примера...
18:58:10:netch@iv:~/tmp/mod>cat hello.c
#include <stdio.h>
void Func( void ) {
printf( "Hello world!\n" );
}
18:58:16:netch@iv:~/tmp/mod>cat bye.c
#include <stdio.h>
void Func( void ) {
printf( "Goodbye cruel world!\n" );
}
19:03:11:netch@iv:~/tmp/mod>cat m.c
#include <dlfcn.h>
#include <err.h>
int main( int argc, char *argv[] ) {
void* libp; const char* errp;
void (*funcp)(void);
if( argc != 2 ) errx( 1, "usage()" );
libp = dlopen( argv[1], RTLD_NOW ); errp = dlerror();
if( !libp ) errx( 1, "dlopen(): %s", errp );
funcp = dlsym( libp, "Func" ); errp = dlerror();
if( errp ) errx( 1, "dlsym(): %s", errp );
if( !funcp ) errx( 1, "dlsym(): ?" );
(*funcp)();
dlclose( libp );
return 0;
}
19:03:16:netch@iv:~/tmp/mod>gcc -o hello.so -shared -Wall hello.c
19:03:37:netch@iv:~/tmp/mod>gcc -o bye.so -shared -Wall bye.c
19:03:45:netch@iv:~/tmp/mod>gcc -o m -g -Wall m.c
19:04:03:netch@iv:~/tmp/mod>./m ./hello.so
Hello world!
19:04:08:netch@iv:~/tmp/mod>./m ./bye.so
Goodbye cruel world!
19:04:11:netch@iv:~/tmp/mod>./m x
m: dlopen(): Shared object "x" not found
19:04:15:netch@iv:~/tmp/mod>./m hello.so
m: dlopen(): Shared object "hello.so" not found
/netch