草庐IT

c++ - 将库 (.lib) 链接到 Visual Studio 2013 项目

coder 2024-02-18 原文

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

  1. Windows系统变量添加动态库路径(Environment variables -> Path)

    • 设置为; C:\Users\venushka\Desktop\libxbee3-win32\lib
  2. Visual Studio(包含头文件和源文件 C++)

    • 配置属性 -> C/C++ -> 常规 -> 附加包含目录设置为 C:\Users\venushka\Desktop\libxbee3-win32
  3. 链接库

    • 配置属性 -> 链接器 -> 常规 -> 附加库目录设置为
    • C:\Users\venushka\Desktop\libxbee3-win32\lib
  4. 添加对象库文件名

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

    • Add -> Existing item (project properties) both .dll & .lib files 但那个东西也没有任何区别仍然保持相同的错误。
  6. 最后我补充

    #pragma comment (lib, "libxbee3.lib")
    #pragma comment (lib, "libxbee3.dll")
    

我收到 Unresolved external 错误,提示我无法成功链接该库。感谢您的帮助。

我附上了截图

错误日志

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

最佳答案

您已经涵盖了大部分基本问题并且 "usual" suspects在 OP 中,例如库位置、名称等。

其他问题可能包括;

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

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

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

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

离开 x86 与 x64 目标。默认情况下,VS 向导针对命令行应用程序的 x86。使用这些默认值,我能够重现错误。

添加x64平台;

  1. 打开“配置管理器”(构建 > 配置管理器)
  2. 从“事件解决方案平台”下拉菜单中选择
  3. 从下拉列表中为新平台选择 x64
  4. (可选)选择要从 x86 平台复制的设置(稍后可以根据需要修改这些设置)
  5. 选中“创建新项目平台”框并单击“确定”

添加后,在构建菜单中,选择 x64 平台目标并重建示例应用程序。

如果 x86 平台是预期目标,则需要重建 libxbee3 库以针对 x86 平台而不是 x64 平台。

旁注; VS2015 警告不匹配的 x86 和 x64 目标(在更新 2 上测试)。


关于不兼容的符号导出注释。

您在赏金说明中提到您;

That library was make from the source files of git ( make GNU for windows)

很可能,这里使用的编译器是 gcc。这在用于导出符号的属性的链接代码库中得到支持;

#define EXPORT __attribute__((visibility("default")))

搜索用于获得类似结果的 MSVC 符号 __declspec(dllexport),没有产生任何结果。

要从 dll 导入符号(并在您的项目中使用它们),MSVC 编译器需要在所需符号上使用相应的 __declspec(dllimport)

典型的(对于 MSVC)库端预处理器 block 是;

#ifdef BUILDING_MY_DLL
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

上述 block 通常包含在 header 中,导出的符号标记为 MY_DLL_API。构建库时,定义 BUILDING_MY_DLL 在命令行或某些内部包含的 header 中定义。构建 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

第二种,将所需的函数签名(和类型)提取到私有(private) header 中以供使用,并使用正确的 dllimport 单独注释它们。

extern "C" {

// ... other definitions required

__declspec(dllimport)
xbee_err xbee_setup(struct xbee **retXbee, const char *mode, ...);

} // extern "C"

第三种方法是仅定义已用作 __declspec(dllimport)EXPORT 并确保定义出现在包含任何库的头文件之前。基本上添加;

#define EXPORT __declspec(dllimport)

在任何包含“xbee.h”之前的文件,例如“stdafx.h”

关于c++ - 将库 (.lib) 链接到 Visual Studio 2013 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494910/

有关c++ - 将库 (.lib) 链接到 Visual Studio 2013 项目的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  6. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  10. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

随机推荐