如何在Visual Studio中隐藏静态库中的类

时间:2014-10-25 23:47:58

标签: c++ c visual-studio static-libraries

我想只有2个extern C函数,它们是如何与API交互的。然后在静态.lib里面,我想让我的班级完成所有的工作。但它不应该在外面可见。

我可以通过在编译单元中将它们声明为静态来使用纯C函数来完成它,但是我如何用类来完成呢?

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题:

  • 您想创建一个只向外界展示两个功能的静态库
  • 但是这个库的内部应该基于你想要从外部世界隐藏的类。
  • 你知道如何隐藏经典c中的内部(即使用辅助静态函数和静态变量),但你不知道如何处理类

如果是这种情况,诀窍就是使用 unamed namespace

在你的图书馆资源中你会有这样的东西:

namespace {  // anonymous
    class U {   // class visible only to the library
    public: 
        int y;  
        U() :y(0) { cout << "U\n"; } 
        void mrun() { y++; } 
    };
}

void f() {
    U x; 
    ...
}

然后,您可以使用来自世界各地的图书馆:

extern void f();   // declare the function (in a header) 
f();               // invoke the function 

即使辅助类将在外部世界声明:

class U { public: int y;  U(); void mrun(); };

如果想要使用U,则无法使用和链接错误。这是因为未命名的命名空间对每个编译单元都是唯一的。

如果您使用相同类型的解决方案但没有匿名命名空间,则辅助类将可见并且链接将成功。

答案 1 :(得分:1)

也许您可以使用C函数镜像该类的API,如下所示:

class Cpp
{
    int i = 0;

public:

    int get_i() { return i; }
    void set_i(int i) { this->i = i; }
};

// C code has a void* as a handle to access
// the correct instance of CPP
extern "C" void* new_Cpp()
{
    return new Cpp;
}

extern "C" void delete_Cpp(void* cpp)
{
    delete reinterpret_cast<Cpp*>(cpp);
}

extern "C" int Cpp_get_i(void* cpp)
{
    return reinterpret_cast<Cpp*>(cpp)->get_i();
}

extern "C" void Cpp_set_i(void* cpp, int i)
{
    return reinterpret_cast<Cpp*>(cpp)->set_i(i);
}