我的VS2012解决方案包含多个VC ++项目。 我还有许多需要共享的常见文件。 分享枚举和结构很容易。我只是“包含”相应的头文件,就是这样。我甚至不需要编译我的“公共”项目!
但是如果我需要共享包含.h和.cpp文件的更复杂的类,那么需要编译呢?
最复杂的问题 - 我可以共享线程安全的单例吗?我想从不同的线程(但是来自一个进程)从不同的项目访问它。
我想我应该使用静态或动态链接之类的东西,但我不确定。可能有人可以链接一步一步的教程来解决这个问题吗?
我更喜欢可移植的东西,因为我稍后会将整个解决方案移到Linux上。
答案 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。
要回答问题的第二部分,是的,您的图书馆中定义的单身人士也可以访问主项目。