Функция C ++ не объявлена ​​после связывания DLL с g ++ в CentOS7 - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь связать dll с очень простой программой тестирования, но получаю ошибку, которую опишу в конце поста.

frvt11.h - Интерфейс (просто соответствующий код), который мне нужно реализовать для создания моей dll

namespace FRVT {
    class Interface {
    public:
        static std::shared_ptr<Interface>
        getImplementation();
    }
}

creation.h - Заголовок моей реализации Inteface

#include "frvt11.h"

namespace FRVT {
    class Implementation : public FRVT::Interface {
    public:
        static std::shared_ptr<Interface>
        getImplementation();
    }
}

creation.cpp - Моя реализация интерфейса

ОБНОВЛЕНИЕ: переход от реализации :: getImplementation к Interface :: getImplementation

#include "implementation.h"
using namespace FRVT;

std::shared_ptr<Interface> 
Interface::getImplementation() {
    std::cout<<"getImplementation";
    return std::make_shared<Implementation>();
}

main.cpp

ОБНОВЛЕНИЕ: Явно указывает пространство имен Интерфейс ::

#include "frvt11.h"
using namespace FRVT;

int main(){
    auto obj = Interface::getImplementation();
    return 0;
}

директивы компиляции

ОБНОВЛЕНИЕ: включает каталог -L / dll, где находятся все .h, .cpp и dll

g++ -std=c++11 -c -Wall -Werror -m64 -fPIC implementation.cpp
g++ -std=c++11 -shared -m64 -o libimplementation.so implementation.cpp
g++ -std=c++11 -Wall -m64 -o main main.cpp -L/dll-directory -limplementation

ошибка

ОБНОВЛЕНИЕ : Первоначальная проблема решена

main.cpp: In function 'int main()':
main.cpp:6:34: error: 'getImplementation' was not declared in this scope
    auto obj = getImplementation();

Как решить эту ошибку? Я ожидал, что компоновщик сделает "магию", чтобы сказать main.cpp, что реализация упомянутой функции будет в dll. Что я делаю не так?

1 Ответ

0 голосов
/ 06 июля 2018

В реализации.cpp я изменился с:

Implementation::getImplementation()

до:

Interface::getImplementation()

В main.cpp я явно указал интерфейс, как показано ниже:

auto obj = Interface::getImplementation();

И, наконец, я использовал директиву -L, чтобы указать, где была сгенерированная dll.

...