【发布时间】: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++