【问题标题】:how to share class between c++ projects?如何在 C++ 项目之间共享类?
【发布时间】:2013-11-21 10:48:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 图书馆怎么样?

标签: c++ visual-c++


【解决方案1】:

包含您要共享的类的项目应导出其符号。当您在 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 一样。

要回答您问题的第二部分,是的,主项目也可以访问您库中定义的单例。

【讨论】:

猜你喜欢
  • 2018-11-22
  • 2011-01-08
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多