c++ - 使用 extern "C"时 C++ 代码中的函数重载

标签 c++ inheritance virtual-functions

我想在运行时加载库。我有一个基类“Base”和两个派生类“Derived1”和“Derived2”,它们应该在运行时加载。我正在使用 this answer 中的方法有一些小的修改。当我只定义一个派生类时,代码编译得很好,但是当定义了几个派生类时,它编译失败。编译错误如下:multiple definitions of 'create'我认为问题是“C”不允许函数名重载。如何解决这个问题?
重要的一点是,因为我不知道有多少 .so文件存在,我想为所有 .so 设置一个处理程序文件。代码的详细信息如下:base.hpp :

class Base {
public:
    virtual ~Base() {}
    virtual void foo() const = 0;
};

using Base_creator_t = Base *(*)();
derived1.hpp :
#include "Interface.hpp"

class Derived1: public Base {
public:
    void foo() const override {}
};

extern "C" {
Base * create() {
    return new Derived1;
}
}
derived2.hpp :
#include "Interface.hpp"

class Derived2: public Base {
public:
    void foo() const override {}
};

extern "C" {
Base * create() {
    return new Derived2;
}
}
动态共享库处理程序:Derived_factory.hpp :
#include <dlfcn.h>

class Derived_factory {
public:
    Derived_factory(char* path) {
        handler = dlopen(path, RTLD_NOW);
        if (! handler) {
            throw std::runtime_error(dlerror());
        }
        Reset_dlerror();
        creator = reinterpret_cast<Base_creator_t>(dlsym(handler, "create"));
        Check_dlerror();
    }

    std::unique_ptr<Base> create() const {
        return std::unique_ptr<Base>(creator());
    }

    ~Derived_factory() {
        if (handler) {
            dlclose(handler);
        }
    }

private:
    void * handler = nullptr;
    Base_creator_t creator = nullptr;

    static void Reset_dlerror() {
        dlerror();
    }

    static void Check_dlerror() {
        const char * dlsym_error = dlerror();
        if (dlsym_error) {
            throw std::runtime_error(dlsym_error);
        }
    }
};
main.cpp :
#include "Derived_factory.hpp"
int main(){
   Derived_factory factoryOne("Derived1.so");
      std::unique_ptr<Base> baseOne = factoryOne.create();
      baseOne->foo();
   Derived_factory factoryTwo("Derived2.so");
     std::unique_ptr<Base> baseTwo = factoryTwo.create();
     baseTwo->foo();
   return 0;
}

最佳答案

问题不是extern "C" .问题是您对同一函数有多个定义。Base * create()Base * create() 无法区分

关于c++ - 使用 extern "C"时 C++ 代码中的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64153803/

相关文章:

.net - 什么是好的策略?在没有默认 Virtual 的情况下使用 C# 中的 Mock 进行测试

c++ - 我可以在函数内执行 "variable statements"而没有定义吗?

c++ - 有没有你想要虚函数而不是纯虚函数的场景?

c++ - 父类(super class)可以继承子类的方法吗?

java - 子类抛出 UnsupportedOperationException 与忽略输入参数

java - Scala 使用可变参数构造函数扩展 Java 类

java - 为什么需要调用父类(super class)构造函数?

c++ - 如何在 Qt/hook QPainter 中渲染没有抗锯齿的 SVG 以避免抗锯齿?

c++ - 结构中的字符串

C++ 链接器在查找 openssl MD4 函数时遇到问题