Вызов функции-члена класса с использованием объектов, вызывающих ошибку поиска - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь собрать плагины в c ++, используя библиотеку boost. helper.h Заголовочный файл:

    #include <string>
    #ifndef HELPER_H
    #define HELPER_H

    class Helper
    {
        public:
        std::string s;
        void helper_new(std::string a);
    };

    #endif

Я определил функцию-член в файле helper. cpp

    #include "helper.h"
    namespace boostfs = boost::filesystem;
    namespace boostdll = boost::dll;
    namespace dll = boost::dll;


    // Member Functions() 
    void Helper::helper_new(std::string a) 
    { 
        //int i=0;
        std::cout<<"Inside helper_new function!!";
        std::cout<<"\n";
        std::cout<<a;
        std::cout<<"\n";
        /*std::ofstream MyFile("/home/deepansh/Desktop/Plugin_example/outputs/helper.txt");
        std::cout << "Writing in helper.txt\n"; */
        /*for(i=0;i<LONG_MAX;i++)
                for(int j=0;j<LONG_MAX;j++);*/
        /*MyFile<<a+" ";
        MyFile<<i;
        MyFile<<"\n";
        MyFile.close();*/
        std::cout << "Done\n"; 
    } 
int main() {

    Helper obj;
    std::string a;
    std::cout<<"Enter string u want to write?";
    std::getline(std::cin, a);
    obj.s=a;

    int choice=1;
    std::cout<<"which strat to use? \'1\' or \'2\' ?(default is 1)";
    std::cin>>choice;

    std::string file="strat"+std::to_string(choice);
    boostfs::path lib_path = boostfs::current_path();
    boost::filesystem::path p2(std::string(lib_path.string()).append("/plugins/").append(file).append(".so"));



    boost::shared_ptr<plugin_api> plugin;            // variable to hold a pointer to plugin variable
    std::cout << "Loading the plugin" << std::endl;

    plugin = dll::import<plugin_api>(          // type of imported symbol is located between `<` and `>`
        p2,                     // path to the library and library name
        "plugin",                                       // name of the symbol to import
        dll::load_mode::append_decorations              // makes `libmy_plugin_sum.so` or `my_plugin_sum.dll` from `my_plugin_sum`
    );

    plugin->handle_task(obj);

    std::cout << plugin->print() << std::endl;
}

I Вызвал функцию-член из другого файла с помощью объекта класса Helper, переданного ему в качестве аргумента (это компилируется как файл) strat1. cpp

#include "../helper.h"
#include <string>
namespace my_namespace {

class strat : public plugin_api {
public:
    strat() {
        std::cout << "Constructing start" << std::endl;
    }

    std::string print() const {
        return "Hello from strat 1";
    }

    int handle_task(Helper a) {
        //long i=0;

        //std::ofstream fout;
        //fout.open("/home/deepansh/Desktop/Plugin_example/outputs/strat1.txt");
        std::cout<<"Inside strat 1";
        std::cout<<"\n";
        /*for(i=0;i<LONG_MAX;i++)
            for(int j=0;j<LONG_MAX;j++);*/
        //fout<<a.s+" ";
        //fout<<i;
        //fout<<"\n";
        //fout.close();

        std::cout<<a.s;
        std::cout<<"\n";
        std::cout<<"going to the helper class function.";
        std::string p="Hello man. What's up?";
        a.helper_new(p); //error is here
        return 0;
    }

    ~strat() {
        std::cout << "Destructing strat ;o)" << std::endl;
    }

};

Я Получение этой ошибки ./a.out: symbol lookup error: /home/deepansh/Desktop/Plugin_example/plugins/strat1.so: undefined symbol: _ZN6Helper10helper_newENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

При составлении кода может кто-то помочь. компиляция:

  1. Преобразование библиотеки плагинов (реализация плагина) в объектный файл с помощью:

gcc -c -Wall -Werror -fpic strat1.c ../helper.cpp // здесь -wall и -Werror предназначены для предупреждений

Затем преобразуйте .o файлы в .so файлы, используя (создание общей библиотеки из объектного файла):

gcc -shared -o strat1.so strat1.o

g++-8 helper.cpp -L/usr/lib/x86_64-linux-gnu -lboost_filesystem -L/usr/lib/x86_64-linux-gnu -lboost_system -ldl

при запуске исполняемого файла a.out возникает ошибка

...