链接到 Visual Studio 动态库
Posted
技术标签:
【中文标题】链接到 Visual Studio 动态库【英文标题】:Linking to visual studio dynamic library 【发布时间】:2020-05-05 14:57:35 【问题描述】:我正在尝试创建一个动态库并在控制台应用程序中使用它。图书馆是Multisite.lib
。
我的问题是,当我将项目添加为引用并添加头文件目录时,它运行良好,但是,当我尝试在独立项目中使用此库时,我收到 unresolved external symbol
错误。
我在独立项目中所做的是将库添加到 Linker > Input > Additional Dependencies 并添加头目录
#pragma once
#ifndef MultiSite_IMPORTS
#define MATHLIBRARY_API extern "C" __declspec(dllexport)
#else
#define MATHLIBRARY_API extern "C" __declspec(dllimport)
#endif
#define STACKMODE __stdcall
#include <string>
struct interfaceManager;
MATHLIBRARY_API interfaceManager* STACKMODE createInstance();
MATHLIBRARY_API void STACKMODE bert_init(interfaceManager * inst , int bid);
MATHLIBRARY_API bool STACKMODE bert_connect(interfaceManager * inst, std::string IP);
这些是我试图导出的函数,它们被认为是未解析的外部符号
编辑
我尝试使用dumpbin /EXPORTS MultiSite.lib
使用VS 开发人员工具,我的所有功能都在那里
【问题讨论】:
【参考方案1】:标头不包含使 Visual Studio 链接到正确库所需的魔法线。那是#pragma comment(lib, "MultiSite.lib")
。它在#define MATHLIBRARY_API extern "C" __declspec(dllimport)
之后。
或者,您确实可以直接告诉链接器MultiSite.lib
是一个附加输入。查看可执行项目的 Visual Studio 链接器属性页。
【讨论】:
在问题中它说将库添加到链接器>输入>附加依赖项我认为问题中需要更多信息。也许是错误的确切文本 @drescherjm 错误的文本是unresolved external symbol createInstance
和其他两个函数。
@MSalters 问题是我已经使用类似的类创建了另一个库,但我从未使用过#pragma comment(lib, "MultiSite.lib")
,它工作正常
三个符号都可以
你定义了预处理器符号MultiSite_IMPORTS
所以MATHLIBRARY_API
是extern "C" __declspec(dllimport)
【参考方案2】:
“我在独立项目中所做的就是将库添加到Linker > Input > Additional Dependencies 并添加头目录”
就我而言,该项目缺少MultiSite.lib
。我建议您应该将 .lib 文件的路径添加到附加库目录(属性 -> 链接器 -> 常规 -> 附加库目录)。
【讨论】:
我确实添加了库路径,但问题是库的输出是 x64 配置库,而独立项目配置为 x86。我认为视觉工作室通常会告诉你它是错误的格式或什么的。从来不知道它编译为未定义的符号。【参考方案3】:问题是在 32 位 应用程序上使用 64 位 库。 这就是为什么当我将它添加到同一个解决方案而不是我的独立项目时它工作正常的原因。
我曾经认为 Visual Studio 可以检测到错误的格式,但事实证明,只有导出符号的名称在两个具有不同位配置的相同库之间发生变化。
因此这解释了我遇到的unresolved external symbol
错误
【讨论】:
这就是我询问其他错误的原因。在这种情况下,Visual Studio 通常会添加一个链接器错误,提示无法打开Multisite.lib
以上是关于链接到 Visual Studio 动态库的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017 动态链接库(DLL /LIB) 静态链接库(LIB)的思考