LINUX.ORG.RU

Пишем хидер библиотеки:

=== testso.h ===
#include <string>
int myFunc(const std::string &s);
=== testso.h ===

Пишем собственно библиотеку:

=== testso.cpp ===
#include <iostream>
#include "testso.h"

int myFunc(const std::string &s)
{
    std::cout << s << std::endl;
    return 2+2;
}
=== testso.cpp ===

Компилируем нашу библиотеку:

g++ -shared -fPIC testso.cpp -o libtestso.so

Радуемся пять минут, потом пишем программу использующую 
библиотеку:

=== testprog.cpp ===
#include "testso.h"

int main(int argc, char *argv[])
{
    myFunc("test");
    return 0;
}
=== testprog.cpp ===

Компилируем программу:

g++ testprog.cpp -L. -l testso -o testprog

Копируем библиотеку в каталог с прописанный в путях 
загрузчика либо указываем загрузчику что библиотеки
надо искать в текущем каталоге:

export LD_LIBRARY_PATH=.

Запускаем наше бессмертное творение:

$ ./testprog 
test

Радуемся жизни и задумываемся о том, что из человека не
умеющего читать документацию (man gcc) хорошего 
программиста не получится.

anonymous
()

Можно использовать библиотеку dl (удобно при реализации подключаемых модулей).
Пример динамической компоновки (черновой набросок).
Наша библиотека:

mymodule.c:
------------------------
int foo()
{
	/* сотни строк кода. */ 
	return 0;
}

Makefile для mymodule.c:
------------------------
PROG = mymodule.so
OBJS = mymodule.o

.PHONY: all clean
all: $(PROG)

$(PROG): $(OBJS)
	gcc -shared -o $@ $^

.c.o:
	gcc -Wall -fPIC -o $@ -c $<

mymodule.o: mymodule.c 

clean:
	rm *.o $(PROG)

Главный файл main.c, использующий библиотеку:
------------------------
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

typedef int (*FUN_FOO)();

int main()
{
	void *sohandle = NULL;
	
	if ((sohandle = dlopen("./mymodule.so", RTLD_LAZY)) == NULL) {
		fprintf(stderr, "myprog: dlopen() failed: %s\n", dlerror());
		exit(1);
	}
	
	fun_foo = (FUN_FOO) dlsym(sohandle, "foo");
	if (fun_foo == NULL) {
		fprintf(stderr, "myprog: dlsym() failed: %s\n", dlerror());
		exit(1);
	}
	(*fun_foo)();
	return 0;
}

Собирать main.c надо с библиотекой dl (опция для gcc -ldl).
Как посоветовали выше - man dlopen. 

mgk
()

эта... info libtool

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.