Скажем, у меня есть абстрактный базовый класс, определенный как так:Определение интерфейса абстрактного класса в общей библиотеке
interface.hpp
#ifndef INTERFACE_HPP
#define INTERFACE_HPP 1
class interface{
public:
virtual void func() = 0;
};
#endif // INTERFACE_HPP
Затем я компилировать блок test.cpp
перевода в общий объект test.so
:
test.cpp
#include "interface.hpp"
#include <iostream>
class test_interface: public interface{
public:
void func(){std::cout << "test_interface::func() called\n";}
};
extern "C"
interface &get_interface(){
static test_interface test;
return test;
}
Если открыть этот общий объект в исполняемый файл и попытаться вызвать get_interface
так:
#include <dlfcn.h>
#include "interface.hpp"
int main(){
void *handle = dlopen("test.so", RTLD_LAZY);
void *func = dlsym(handle, "get_interface");
interface &i = reinterpret_cast<interface &(*)()>(func)();
i.func(); // print "test_interface::func() called"
dlclose(handle);
}
(только делают вид, что я сделал проверку ошибок)
корректно определено поведение? Или я нахожусь на своих пальцах, полагая, что это всегда будет работать?
Имейте в виду, я только когда-либо использовать лязг и GCC
Если вы используете один и тот же компилятор, то я не вижу причин, по которым это может пойти не так. Я просто портировал ваш образец на msvc (2015rc), и он там тоже работает. –
Вы должны быть в порядке, если поддерживаете двоичную совместимость. См. Эти ... http://stackoverflow.com/questions/1774911/how-to-design-ac-api-for-binary-compatible-extensibility https://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++ http://stackoverflow.com/questions/3217513/are-llvm-gcc-and-clang-binary-compatible-with-gcc-particularly-mingw-gcc-on-w – QuestionC