C++ 从DLL访问向量
我在一个项目中工作,我必须构建一个库,并在主函数中使用该库。该库是.dll,它有7个头文件和5个源文件。在头文件中,我声明了一个向量,并在其中一个源文件中实现。由于我必须在主程序中访问该向量,我在该源文件中声明它为全局,在该头文件。现在,在我构建Dll并将其与我的主程序链接后,我无法访问该向量,因为它显示“未解析的外部”。我不知道到底是什么错误,因为它在加载时链接时工作正常,但在运行时链接时出错。欢迎提供任何帮助。我的代码是这样的C++ 从DLL访问向量,c++,dll,vector,C++,Dll,Vector,我在一个项目中工作,我必须构建一个库,并在主函数中使用该库。该库是.dll,它有7个头文件和5个源文件。在头文件中,我声明了一个向量,并在其中一个源文件中实现。由于我必须在主程序中访问该向量,我在该源文件中声明它为全局,在该头文件。现在,在我构建Dll并将其与我的主程序链接后,我无法访问该向量,因为它显示“未解析的外部”。我不知道到底是什么错误,因为它在加载时链接时工作正常,但在运行时链接时出错。欢迎提供任何帮助。我的代码是这样的 NTFS-STRUCT.h ---- &g
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();
NTFS-STRUCT.h-->库头
_cdecl(dllexports)外部std::vectorfiles;
NTFS-Search.cpp------->库源文件
#包括“NTFS-STRUCT.h”
矢量文件;-->用于在主程序中访问的全局向量
MFT列表--->主程序
#包括“NTFS-STRUCT.h”
不能使用宏来区分“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项目成为解决方案“项目依赖项”中EXE的依赖项
在EXE的链接器->常规
属性中,将链接库依赖项设置为yes
方法三:显式添加库文件(LIB)
转到链接器->输入
属性并将lib文件添加到附加依赖项
列表中,对于EXE,当MFT-list.cpp读取NTFS-STRUCT.h时,它必须看到dllimport,而不是dllexport。使用宏来区分“build dll”和“build exe”的大小写。@manuell我在标题中尝试了类似的方法#ifdef NTFS#u STRUCT#define NTFS#u STRUCT extern“C”#uu declspec(dllexport)#else#define NTFS#u STRUCT extern“C”#endif请帮助我指定我必须包含在NTFS Search.cpp(源)和MFT-LIST.cpp(主程序)中的内容请注意,在EXE和DLL之间共享全局变量并不是最好的做法。你可以让一个DLL导出函数引用一个向量,并在调用时更新它。@manuell我尝试了一个函数,当它从main调用时返回DLL中的向量,但最终导致堆损坏,并对查找问题发生的位置感到非常愤怒。首先验证我的答案是否解决了你的问题,然后,也许,使用以向量引用为参数的函数进行第二次尝试。确保EXE和DLL是使用相同的设置(C运行时、调试/发布等)生成的。通常build_DLL
它被添加到DLL项目生成配置中,用于预处理器宏定义,但这几乎不会影响此答案的有效性+1.@WhozCraig谢谢。源代码中定义的BUILD#DLL(仅在DLL.cpp源代码中定义)对我来说似乎更清晰、更容易。@manuell顺便问一下,这个BUILD#DLL被称为#ifdef.。我是否必须对项目的sttings或wat进行任何更改?感谢您的代码片段,但它显示了错误。(@warriorpince BUILD_DLL在NTFS-Search.cpp中定义在#include之前。显示了什么错误?@manuell语句DECLSPEC_DLL extern std::vector files中有一个奇怪的错误;--类型说明符假定默认为int,vector不是std的成员,string不是std的成员
// NTFS-Search.cpp
#define BUILD_DLL
#include "NTFS-STRUCT.h"
std::vector<std::string> files;
// MFT-List.cpp
#include "NTFS-STRUCT.h"
cout << "Vector size" << files.size();
DECLSPEC_DLL void UpdateVector( std::vector<std::string> & files );
#pragma lib( comment, "mylib.lib" )