将库(.lib)链接到Visual Studio 2013项目中

时间:2016-05-28 03:31:13

标签: c++ visual-studio makefile

我按照link的说明建立了图书馆。为了将该库链接到Visual Studio,我使用了以下方法,但它们都无法链接到我构建的.lib文件。

  1. Windows系统变量添加动态库路径(环境变量 - >路径)

    • 设为; C:\ Users \用户venushka \桌面\ libxbee3-的win32 \ lib中
  2. Visual Studio(包括头文件和源文件C ++)

    • 配置属性 - > C / C ++ - >一般 - >其他包含目录设置为C:\ Users \ venushka \ Desktop \ libxbee3-win32
  3. 链接库

    • 配置属性 - >链接器 - >一般 - >其他库目录设置为
    • C:\用户\ venushka \桌面\ libxbee3-的win32 \ lib中
  4. 添加对象库文件的名称

    • 配置属性 - >链接器 - >输入 - >我在libxbee3.lib
    • 添加的附加依赖项
  5. 为了链接目的,我添加了

    • 添加 - >现有项目(项目属性).dll& .lib文件,但那个东西也没有任何区别仍然保持相同的错误。
  6. 最后我添加

    #pragma comment (lib, "libxbee3.lib")
    #pragma comment (lib, "libxbee3.dll")
    
  7. 我收到了未解决的外部错误,表示我无法成功链接该库。任何帮助表示赞赏。

    我附上了截屏Screenshot

    错误日志

    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
    

3 个答案:

答案 0 :(得分:6)

您已经涵盖了OP中的大部分基本问题和"usual" suspects,例如图书馆位置,名称等。

其他问题可能包括;

  • 混合x86和x64版本
  • 从dll导出符号(可以使用dumpbin /exports
  • 进行检查
  • 名称修改(虽然这应该没问题,但它是一个C API)
  • 不兼容的符号导出注释(混合GCC和MSVC)

鉴于提供的示例代码(在评论中链接),到构建的lib和dll的链接,我已经能够验证(使用VS2015更新2);

  • 从dll导出符号(正如您已构建的那样)
  • 名称不会出现损坏,extern "C"似乎已正确应用
  • 在包含" xbee.h"之前添加了一个简单的#define EXPORT __declspec(dllimport)。文件已被添加。

鉴于上述内容以及x64 lib和dll,我可以编译并链接示例代码。

离开x86与x64目标。默认情况下,VS向导将x86作为命令行应用程序的目标。使用这些默认值,我可以重现错误。

添加x64平台;

  1. 打开"配置管理器" (构建>配置管理器)
  2. 来自" Active Solution Platform"下拉菜单,选择
  3. 从新平台的下拉列表中选择x64
  4. (可选)选择要从x86平台复制的设置(可以在以后根据需要进行修改)
  5. 选中"创建新项目平台"然后单击“确定”
  6. 添加后,在构建菜单中,选择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,并使用上面的dllexportdllimport;

    #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)

可能的错误原因:

  1. xbeetest.cpp
  2. 中没有包含标题
  3. 您已将dll文件包含在项目中,但未包含在链接过程中。
  4. 链接器变得混乱。
  5. 可能的方法:

    1. 使用LoadLibrary()
    2. 不使用dll,只使用整个源代码

答案 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 _。