我正在一个项目中工作,我必须建立一个库并在主函数中使用该库。库是.dll,它有7个标题和5个源文件。在标题中我声明了一个向量,我实现了其中一个源文件。因为我必须在我的主程序中访问此向量我在该源文件中声明它是全局的并且在该头文件中作为extern。现在我构建我的Dll并将其与我的主程序链接后我无法访问向量,因为它显示“未解析的外部”。我不知道究竟是什么错误,因为它完美地工作加载时间链接但在运行时链接获取错误。请欢迎任何帮助。我的代码是这样的< / p>
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 :(得分: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" )
方法二:使用依赖项设置。
yes
EXE的Link Library dependencies
属性中的Linker->General
方法三:显式添加库文件(LIB)
转到Linker->Input
属性并将lib文件添加到Additional Dependencies
列表中,用于EXE