如何在c ++项目之间共享类?

时间:2013-11-21 10:48:10

标签: c++ visual-c++

我的VS2012解决方案包含多个VC ++项目。 我还有许多需要共享的常见文件。 分享枚举和结构很容易。我只是“包含”相应的头文件,就是这样。我甚至不需要编译我的“公共”项目!

但是如果我需要共享包含.h和.cpp文件的更复杂的类,那么需要编译呢?

最复杂的问题 - 我可以共享线程安全的单例吗?我想从不同的线程(但是来自一个进程)从不同的项目访问它。

我想我应该使用静态或动态链接之类的东西,但我不确定。可能有人可以链接一步一步的教程来解决这个问题吗?

我更喜欢可移植的东西,因为我稍后会将整个解决方案移到Linux上。

1 个答案:

答案 0 :(得分:2)

包含要共享的类的项目应导出其符号。在Visual Studio中创建DLL项目时,可以为其提供“导出”符号选项,并提供一些样板代码供您使用。

从本质上讲,在您的库头文件中,它将为您提供:

// myapi.h

#if defined(MYAPIEXPORTS)
    #define MYAPI __declspec(dllexport)
#else
    #define MYAPI __declspec(dllimport)
#endif

'MYAPIEXPORTS'由向导提供,但它只是库本身的编译器预处理器指令。因此,当您编译库时,MYAPI用于导出,当头文件包含在您的其他项目中时,它将用于导入。

现在让我们看一下你想要分享的课程。

// myclass.h

class MYAPI MyClass
{
public:
    MyClass();
    ~MyClass();
};


// myclass.cpp
#include "myClass.h"

MyClass::MyClass() { /* ... */ };
MyClass::~MyClass() { /* .... */ }

然后,您的其他项目需要链接生成的.lib文件。

请注意,如果您的template<>类完全包含在头文件中,则不会将其导出。这将表现得像你的枚举和typedef。

要回答问题的第二部分,是的,您的图书馆中定义的单身人士也可以访问主项目。