Я делаю общую библиотеку, которая экспортирует функцию, которая использует экземпляр класса stati c. Общая библиотека предназначена для динамической загрузки. Однако по какой-то причине использование экземпляра класса stati c приводит к сбою загрузки dynamici c. Я загружаю библиотеку, используя Poco.
//my_library.h
#ifndef MY_LIB_H
#define MY_LIB_H
#define DUMMY_MSG 1;
class SendClass
{
public:
SendClass() = default;
SendClass( const SendClass &other ) = delete;
SendClass &operator=( const SendClass &other ) = delete;
static SendClass *get_instance(){ return &singleton_instance; };
int send(){ return DUMMY_MSG; };
private:
static SendClass singleton_instance;
};
extern "C" __attribute__ ((visibility ("default"))) int send();//this is the function to be exported
inline int send()
{
return SendClass::get_instance()->send();
}
#endif // MY_LIB_H
Я скомпилировал вышеуказанный заголовочный файл в общую библиотеку, используя команду ниже, и поместил библиотеку в / tmp /
g++ -shared -fPIC -o libexp.so my_library.h
И затем я пытаюсь загрузить библиотеку в моей основной программе
//main.cpp
#include "Poco/SharedLibrary.h"
using namespace std;
typedef int(*SENDFUNC)();
int main
(
int argc,
char **argv
)
{
Poco::SharedLibrary lib;
lib.load( "/tmp/libexp.so" ); //crashes here!
SENDFUNC send_func = (SENDFUNC)lib.getSymbol("send");
int msg = send_func();
return 0;
}
Программа вылетает в строке "lib.load (" /tmp/libexp.so ");" со следующим сообщением:
завершить вызов после выброса экземпляра
'Poco :: LibraryLoadException' what (): Невозможно загрузить библиотеку
Однако, если я измените тело SendClass :: get_instance следующим образом: загрузка динамического файла c успешно завершена
//if SendClass::get_instance is implemented as follows, dynamic loading succeeds
static SendClass *get_instance(){ return new SendClass; };
Так почему использование экземпляра stati c вызывает сбой загрузки динамического интерфейса c?