【问题标题】:store and access data in library dll在库 dll 中存储和访问数据
【发布时间】:2020-12-05 23:37:48
【问题描述】:

我有一个 dll 和关联的 lib 文件,其中包含许多 std::vector 实例,例如

在 data.h 我有:

namespace xyz{
extern DllExport std::vector<double> delays;
...

在 data.cpp 我有:

namespace xyz{
std::vector<double> delays{0, 1, 4, 24, 52, 104};
...

data.cpp 被编译并链接到 mydata.lib、mydata.dll 并且延迟似乎作为导出可见:

dumpbin /exports ..\bin\debug\mydata.lib | grep delays
?delays@xyz@@3V?$vector@NV?$allocator@N@std@@@std@@A (class std::vector<double,class std::allocator<double> > xyz::delays)

我编译program.cpp,包括data.h,它想使用延迟,例如

for (int i = 0; i < xyz::delays.size(); i++)
    std::cout << xyz::delays[i] << std::endl;

试图与 mydata.lib 链接,但我得到例如

cl  -EHsc -std:c++17 -I../include -Zi -MDd ../src/exe/program.cpp -link -DEBUG ../bin/debug/data.lib /OUT:../bin/debug/program.exe

program.obj : error LNK2001: unresolved external symbol "class std::vector<double,class std::allocator<double> > xyz::delays" (?delays@xyz@@3V?$vector@NV?$allocator@N@std@@@std@@A)../bin/debug/program.exe : fatal error LNK1120: 1 unresolved externals

data.lib 中的类定义,dll 可以在程序中使用,但我可以合并一些数据,例如延迟到 lib,dll 中,以便我可以与 lib,dll 上的任何程序调用共享和访问它?

如果使用 Windows 10 和 microsoft 编译器 (19.16) 和链接器 (14.16) 不明显。

谢谢...

【问题讨论】:

  • DllExport 在哪里以及如何定义?
  • #define DllExport __declspec(dllexport) in data.h
  • 构建 DLL 时是正确的,但对于使用 DLL 的代码则不然。 program.cpp 必须使用定义为 __declspec(dllimport)DllExport 构建,或者根本没有定义。例如,请参阅Why/when is __declspec( dllimport ) not needed?

标签: c++


【解决方案1】:

dxiv 提供的答案和链接帮助我解决了问题。在我的文件 data.h 我现在有

#ifdef EXPORTING
#define DllExport __declspec(dllexport)
#else
#define DllExport __declspec(dllimport)
#endif

我用 -DEXPORTING 编译 mydata.lib, dll

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多