Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从DLL访问向量_C++_Dll_Vector - Fatal编程技术网

C++ 从DLL访问向量

C++ 从DLL访问向量,c++,dll,vector,C++,Dll,Vector,我在一个项目中工作,我必须构建一个库,并在主函数中使用该库。该库是.dll,它有7个头文件和5个源文件。在头文件中,我声明了一个向量,并在其中一个源文件中实现。由于我必须在主程序中访问该向量,我在该源文件中声明它为全局,在该头文件。现在,在我构建Dll并将其与我的主程序链接后,我无法访问该向量,因为它显示“未解析的外部”。我不知道到底是什么错误,因为它在加载时链接时工作正常,但在运行时链接时出错。欢迎提供任何帮助。我的代码是这样的 NTFS-STRUCT.h ---- &g

我在一个项目中工作,我必须构建一个库,并在主函数中使用该库。该库是.dll,它有7个头文件和5个源文件。在头文件中,我声明了一个向量,并在其中一个源文件中实现。由于我必须在主程序中访问该向量,我在该源文件中声明它为全局,在该头文件。现在,在我构建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();
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" )