我按照link的说明建立了图书馆。为了将该库链接到Visual Studio,我使用了以下方法,但它们都无法链接到我构建的.lib文件。
Windows系统变量添加动态库路径(环境变量 - >路径)
Visual Studio(包括头文件和源文件C ++)
链接库
添加对象库文件的名称
为了链接目的,我添加了
最后我添加
#pragma comment (lib, "libxbee3.lib")
#pragma comment (lib, "libxbee3.dll")
我收到了未解决的外部错误,表示我无法成功链接该库。任何帮助表示赞赏。
错误日志
Error 1 error LNK2019: unresolved external symbol _xbee_setup referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj
Error 2 error LNK2019: unresolved external symbol _xbee_shutdown referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj
Error 3 error LNK2019: unresolved external symbol _xbee_conGetTypes referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj
Error 4 error LNK2019: unresolved external symbol _xbee_errorToStr referenced in function _wmain C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\xbeetest\xbeetest.obj
Error 5 error LNK1120: 4 unresolved externals C:\Users\venushka\documents\visual studio 2013\Projects\xbeetest\Debug\xbeetest.exe 1
答案 0 :(得分:6)
您已经涵盖了OP中的大部分基本问题和"usual" suspects,例如图书馆位置,名称等。
其他问题可能包括;
dumpbin /exports
)鉴于提供的示例代码(在评论中链接),到构建的lib和dll的链接,我已经能够验证(使用VS2015更新2);
extern "C"
似乎已正确应用#define EXPORT __declspec(dllimport)
。文件已被添加。鉴于上述内容以及x64 lib和dll,我可以编译并链接示例代码。
离开x86与x64目标。默认情况下,VS向导将x86作为命令行应用程序的目标。使用这些默认值,我可以重现错误。
添加x64平台;
添加后,在构建菜单中,选择x64平台目标并重建示例应用程序。
如果x86平台是预期目标,则需要重建libxbee3库以定位x86平台而不是x64平台。
旁注; VS2015警告x86和x64目标不匹配(在更新2上测试)。
在不兼容的符号导出注释上。
你在赏金笔记中提到你;
该库是从git的源文件制作的(make GNU for windows)
最有可能的是,这里使用的编译器是gcc。链接代码库支持此功能,该属性用于导出符号;
#define EXPORT __attribute__((visibility("default")))
搜索用于获得类似结果的MSVC符号__declspec(dllexport)
不会产生任何结果。
要从dll导入符号(并使用它们是您的项目),MSVC编译器需要在所需符号上使用相应的__declspec(dllimport)
。
典型的(对于MSVC)库侧预处理器块是这样的;
#ifdef BUILDING_MY_DLL
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
上面的块通常包含在标题中,导出的符号标记为MY_DLL_API
。构建库时,定义BUILDING_MY_DLL
在命令行或某些内部包含的头中定义。构建exe(或客户端)时,不会生成定义BUILDING_MY_DLL
,因此标记符号以进行导入。
要解决导入/导出符号问题,有一些基本方法。
第一个是修改代码并使用MSVC重建dll,并使用上面的dllexport
和dllimport
;
#ifdef BUILDING_LIBXBEE3
// define BUILDING_LIBXBEE3 on the command line when building the dll...
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
第二,将所需的函数签名(和类型)提取到私有头中,以便使用并使用正确的dllimport
单独注释它们。
extern "C" {
// ... other definitions required
__declspec(dllimport)
xbee_err xbee_setup(struct xbee **retXbee, const char *mode, ...);
} // extern "C"
第三种方法是仅定义已用作EXPORT
的{{1}},并确保在包含任何库的头文件之前出现定义。基本上添加;
__declspec(dllimport)
到" stdafx.h"等文件。在包括" xbee.h"
之前答案 1 :(得分:0)
可能的错误原因:
可能的方法:
答案 2 :(得分:0)
这可能不是完整的答案 - 但让我们从分析图书馆内的内容开始。
How to See the Contents of Windows library (*.lib)
你能运行DUMPBIN / SYMBOLS libxbee3.lib吗? 并查看.lib公开的函数符号。
Visual studio 2015 run-time dependencies or how to get rid of Universal CRT?
我也记得那个" __ imp _"函数前缀应该是从.dll导入/导出的东西 - 可能是你的调用转换不正确 - 所以你需要确保dll端的__declspec(dllexport)和调用者端的__declspec(dllimport),并且导出的函数条目开始来自__imp _。