Мне нужно реализовать что -то вроде механизма плагина. Для загрузки библиотеки я использую boost.dll. < /P>
Я хочу вернуть экземпляр класса потока, реализованный в библиотеке.
class EXPORT_DECLSPEC BaseA
{
public:
virtual ~BaseA() = default; // with {} repeated too.
};
class EXPORT_DECLSPEC DerivedA : public BaseA
{
public:
void method2();
};
// Some function to get derived instance.
BaseA* get_derived_instance() { return new DerivedA(); }
< /code>
и в общей библиотеке .cpp: < /p>
void DerivedA::method2()
{
std::cout
#ifdef _WIN32
#ifdef BUILDING_DLL
#define EXPORT_DECLSPEC __declspec(dllexport)
#else
#define EXPORT_DECLSPEC __declspec(dllimport)
#endif
#else // For POSIX
#define EXPORT_DECLSPEC __attribute__((visibility("default")))
#endif
< /code>
В тестовом коде, как это не скомпилировано: < /p>
int main()
{
auto da = dynamic_cast(get_derived_instance());
da->method2();
}
< /code>
, но фаза ссылки не проходит со следующими ошибками: < /p>
[100%] Linking CXX executable test_deb
/usr/bin/ld: CMakeFiles/test_deb.dir/loader_test.cpp.o: in function `BaseLoadTest_BaseLoadTest1_Test::TestBody()':
test_deb/loader_test.cpp:131: undefined reference to `typeinfo for DerivedA'
/usr/bin/ld: CMakeFiles/test_deb.dir/loader_test.cpp.o: in function `DerivedA::DerivedA()':
include/devices/dev_a.h:45: undefined reference to `vtable for DerivedA'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/test_deb.dir/build.make:124: test_deb] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:1174: CMakeFiles/test_deb.dir/all] Error 2
gmake: *** [Makefile:156: all] Error 2
Добавить опцию -e не помогла (Dynamic_cast против динамических границ библиотеки).
Пожалуйста, сообщите, как решить эту проблему и получить экземпляр «Dreviveda» из библиотеки.
Мне нужно реализовать что -то вроде механизма плагина. Для загрузки библиотеки я использую boost.dll. < /P> Я хочу вернуть экземпляр класса потока, реализованный в библиотеке.[code]class EXPORT_DECLSPEC BaseA { public: virtual ~BaseA() = default; // with {} repeated too. };
class EXPORT_DECLSPEC DerivedA : public BaseA { public: void method2(); };
// Some function to get derived instance. BaseA* get_derived_instance() { return new DerivedA(); } < /code> и в общей библиотеке .cpp: < /p> void DerivedA::method2() { std::cout #ifdef _WIN32 #ifdef BUILDING_DLL #define EXPORT_DECLSPEC __declspec(dllexport) #else #define EXPORT_DECLSPEC __declspec(dllimport) #endif #else // For POSIX #define EXPORT_DECLSPEC __attribute__((visibility("default"))) #endif < /code> В тестовом коде, как это не скомпилировано: < /p> int main() { auto da = dynamic_cast(get_derived_instance()); da->method2(); } < /code> , но фаза ссылки не проходит со следующими ошибками: < /p> [100%] Linking CXX executable test_deb /usr/bin/ld: CMakeFiles/test_deb.dir/loader_test.cpp.o: in function `BaseLoadTest_BaseLoadTest1_Test::TestBody()': test_deb/loader_test.cpp:131: undefined reference to `typeinfo for DerivedA' /usr/bin/ld: CMakeFiles/test_deb.dir/loader_test.cpp.o: in function `DerivedA::DerivedA()': include/devices/dev_a.h:45: undefined reference to `vtable for DerivedA' collect2: error: ld returned 1 exit status gmake[2]: *** [CMakeFiles/test_deb.dir/build.make:124: test_deb] Error 1 gmake[1]: *** [CMakeFiles/Makefile2:1174: CMakeFiles/test_deb.dir/all] Error 2 gmake: *** [Makefile:156: all] Error 2 [/code] Добавить опцию -e не помогла (Dynamic_cast против динамических границ библиотеки). Пожалуйста, сообщите, как решить эту проблему и получить экземпляр «Dreviveda» из библиотеки.