Я пытаюсь динамически загружать библиотеки, которые реализуют базовый класс, определенный в другой библиотеке.Я следовал инструкциям, изображенным здесь:
http://www.linuxjournal.com/article/3687?page=0,1
Я создал класс shape и поместил его в отдельную библиотеку (не настоящую библиотеку, так как это просто файл заголовка, но поместил еготаким образом), также я создал две динамические библиотеки, окружность и квадрат, которые наследуются от формы и реализуют метод рисования и регистрируют их функцию создания на заводской карте.Позвольте мне показать вам код:
shape.h:
#ifndef __SHAPE_H
#define __SHAPE_H
#include <map>
#include <string>
// base class for all shapes
class shape{
public:
// our global factory
virtual void draw()=0;
};
// typedef to make it easier to set up our factory
typedef shape *maker_t();
extern std::map<std::string, maker_t *, std::less<std::string> > factory;
#endif // __SHAPE_H
circle.h
#ifndef __CIRCLE_H
#define __CIRCLE_H
#include "shape.h"
class circle : public shape
{
public:
void draw();
};
#endif // __CIRCLE_H
circle.cpp:
#include <iostream>
#include "circle.h"
void circle::draw()
{
// simple ascii square
std::cout << "\n";
std::cout << " ****\n";
std::cout << " * *\n";
std::cout << " * *\n";
std::cout << " * *\n";
std::cout << " * *\n";
std::cout << " * *\n";
std::cout << " ****\n";
std::cout << "\n";
}
extern "C"
{
shape *maker()
{
return new circle;
}
class proxy
{
public:
proxy()
{
// register the maker with the factory
factory["circle"] = maker;
}
};
// our one instance of the proxy
proxy circle_p;
}
Я не буду вдаваться в квадрат, поскольку он почти идентичен кругу и фактическому «клиенту», который динамически загружает библиотеки, поскольку он действительно работает.
Теперь мой вопрос: если у вас есть другие классы и функции в circle.so (это мой случай), а в некоторых случаях вам нужна ссылка во время компиляции (опция -l), я сталкиваюсь спроблемы.Я создал тестовую клиентскую библиотеку, которая вместо динамической загрузки круга делает это во время компиляции.Сбой компоновщика со следующим выводом:
Invoking: GCC C++ Linker
g++ -rdynamic -L/home/lizardking/workspace/dynclientest/Debug/libs -o "test2" ./src/test2.o -ldynlib_circle
/home/lizardking/workspace/dynclientest/Debug/libs/libdynlib_circle.so: undefined reference to `factory'
collect2: ld returned 1 exit status
Файл main.cpp из этого тестового приложения - просто привет !:
#include <iostream>
using namespace std;
int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
Я действительно не знаю, почему компоновщик жалуется на всевремя про карту .... есть идеи ???
спасибо!