LINUX.ORG.RU

Re: в Win есть DLL в а Linux .so как я понял? но как их создать и подлючать?

man dlopen

anonymous ()

Re: в Win есть DLL в а Linux .so как я понял? но как их создать и подлючать?

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

=== 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 ()

Re: в Win есть DLL в а Linux .so как я понял? но как их создать и подлючать?

Можно использовать библиотеку 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 ()

Re: в Win есть DLL в а Linux .so как я понял? но как их создать и подлючать?

эта... info libtool

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