2014-03-06 69 views
1

我在一個項目中工作,我必須建立一個庫並在主函數中使用該庫。庫是.dll,它有7個頭文件和5個源文件。在我聲明的頭文件一個矢量和我在其中一個源文件中實現。因爲我必須在我的主程序中訪問這個矢量,所以我在該源文件中聲明瞭它的全局屬性,並在該頭文件中聲明瞭該屬性的全局屬性。現在,我構建了我的Dll並將其與我的主程序我無法訪問該矢量,因爲它顯示「無法解析的外部」。我不知道究竟是什麼錯誤,因爲它完美的加載時鏈接,但在運行時鏈接獲得錯誤。請任何幫助welcome.My代碼是這樣的從一個DLL訪問一個向量

NTFS-STRUCT.h   ---- > Library Header 

_cdecl(dllexports) extern std::vector<std::string>files; 



NTFS-Search.cpp    ------ > Library Source file 

#include "NTFS-STRUCT.h" 

vector<string>files;   ---> Global Vector for accessing in Main program 


MFT-List --- > Main program 

#include "NTFS-STRUCT.h" 


cout << "Vector size" << files.size(); 

P.S因爲我用Dll鏈接主程序也必須運行時鏈接我設置在VS2010(我工作的平臺)配置爲Delay Dll。

+0

當MFT-LIST.cpp讀取NTFS-STRUCT.h時,它必須看到dllimport,而不是dllexport。使用宏來區分「build dll」與「build exe」之間的區別。 – manuell

+0

@manuell我在頭上試了這樣的東西。#ifdef來NTFS_STRUCT 的#define NTFS_STRUCT的extern 「C」 __declspec(dllexport)的 的#else 的#define NTFS_STRUCT的extern 「C」 __declspec(dllimport的) #ENDIF請通過specyfing我有我的,包括NTFS-Search.cpp幫我(Source)和MFT-LIST.cpp(主程序) – WarriorPrince

+0

請注意,在EXE和DLL之間共享全局變量不是最好的事情。你可以有一個DLL導出函數,它引用一個矢量並在被調用時更新它。 – manuell

回答

2

使用宏來區分「build dll」與「build exe」之間的區別。

DLL部首:

// NTFS-STRUCT.h 
#ifdef BUILD_DLL 
#define DECLSPEC_DLL __declspec(dllexport) 
#else 
#define DECLSPEC_DLL __declspec(dllimport) 
#endif 

DECLSPEC_DLL extern std::vector<std::string> files; 

DLL實現:

// NTFS-Search.cpp 
#define BUILD_DLL 
#include "NTFS-STRUCT.h" 
std::vector<std::string> files; 

EXE:

// MFT-List.cpp 
#include "NTFS-STRUCT.h" 

cout << "Vector size" << files.size(); 

編輯:

:如何通過參考使用導出函數取矢量
DECLSPEC_DLL void UpdateVector(std::vector<std::string> & files); 

如果您遇到堆損壞,可能是因爲您不針對C RunTime庫構建EXE和DLL以及相同且良好的選項。 選項必須Multi-threaded DLL (/MD)Multi-threaded Debug DLL (/MDd) 集論文在Property->C++->Code Generation

EDIT2選項:如何鏈接

方法一:在DLL頭使用#pragma指令。

#pragma lib(comment, "mylib.lib") 

方法二:使用依賴關係設置。

  1. 使DLL項目的EXE的依賴,在「項目依賴」,爲解決
  2. 設置爲yesLinker->General屬性的EXE

方法三的Link Library dependencies:明確添加庫文件(LIB)

轉至Linker->Input屬性並將該lib文件添加到Additional Dependencies列表中,對於EXE

+0

通常'BUILD_DLL'它被添加到預處理器宏定義的DLL-項目構建配置中,但是這很難降低這個答案的有效性。 +1。 – WhozCraig

+0

@WhozCraig謝謝。源代碼中的BUILD_DLL #define,僅在dll.cpp源代碼中,對我來說似乎更加清晰和容易。 – manuell

+0

@manuell btw什麼是BUILD_DLL你把#ifdef ..我必須在項目sttings或掃管笏做任何改變? ( – WarriorPrince