2013-11-21 28 views
0

我的VS2012解決方案包含幾個VC++項目。 我也有很多需要共享的通用文件。 分享枚舉和結構很容易。我只是「包含」相應的頭文件,就是這樣。我甚至不需要編譯我的「公共」項目!如何在C++項目之間共享類?

但是如果我需要共享包含.h和.cpp文件的更復雜的類,那麼需要編譯?

而最複雜的問題 - 我可以共享線程安全的單例嗎?我想從不同線程的不同項目訪問它(但來自一個進程)。

我想我應該使用靜態或動態鏈接,但我不知道。可能有人可以鏈接一步一步的教程來解決這個問題?

我更喜歡可移植的東西,因爲稍後我會將整個解決方案移植到Linux。

+1

圖書館呢? –

回答

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<>類完全包含在頭文件中,則不會導出它。這將表現得像你的枚舉和typedefs。

要回答你的問題的第二部分,是的,你的庫中定義的單例也可以被主項目訪問。

+0

謝謝我已經使用這個教程,它很好http://msdn.microsoft.com/en-us/library/ms235627(v=vs.110).aspx – javapowered

+0

@javapowered,很高興你發現。請注意,您鏈接的教程僅適用於靜態函數,而不是導出您可能希望創建實例的類。 –