【问题标题】:How reference a .lib file (native C++) in a Visual C++ project?如何在 Visual C++ 项目中引用 .lib 文件(本机 C++)?
【发布时间】:2013-04-02 10:16:20
【问题描述】:

我有一个项目,我需要为原生 C++ SDK 制作一个 Visual C++ 包装器,以便最终可以在 C# 中使用。

SDK 包含我正确包含的 .h 文件(这些文件没有编译错误)和一些需要引用的 .lib 文件。这似乎是棘手的部分。

正如我在this question 中所解释的,每当我尝试调用属于库的函数时都会出错。错误如下所示:

error LNK2080: unresolved token (0A000027) "public: static class vhtIOConn *__clrcall vhtIOConn::getDefault(enum vhtICRConn::DeviceType)"
error LNK2019: unresolved external symbol "public: static class vhtIOConn * __clrcall vhtIOConn::getDefault(enum vhtIOConn::DeviceType)"

据我了解,C++/CLR 需要 __clrdecl,而原生 C++ 提供 __clrcall

解决这个问题的正确方法是什么?我在很多地方读到这是可能的,但我还没有看到任何实际的工作示例。请注意,我使用的是 Visual Studio 2010。

【问题讨论】:

  • 哇。我总是惊讶于 Windows 的 ABI 是多么的过于复杂但又被破坏了。 +1,因为让这样的东西工作起来一定很痛苦。
  • 确实很痛苦。我尝试使用这个网站作为最后的手段,但现在我根本不知道如何继续。
  • 很遗憾,我无法真正帮助您,因为 - 幸运的是 - 我从未做过 Windows 编程,但这里有人肯定会给出答案。
  • 当包装器本身可以使用 PInvoke 用 C# 编写时,为什么要创建 Visual C++ 包装器?至于调用约定,请选择适用于您的代码的约定。

标签: visual-studio-2010 visual-c++ linker static-libraries


【解决方案1】:

您可以从链接器错误中判断出了什么问题,请注意错误消息中的 __clrcall。这表明编译器认为您的本机 C++ 正在编译为 MSIL,而不是本机代码。编译得很好,任何兼容的 C++03 代码都可以编译为 MSIL,但是当你尝试链接它时会死掉。你必须让它知道,你可以简单地使用#pragma:

#pragma managed(push, off)
#   include "foo.h"
#pragma managed(pop)

【讨论】:

  • 您能否再详细说明一下?在我的示例中,我有一个 MainForm.h 文件,其中包括几个非托管 C++ 文件。让我们将这些文件称为foo.h。如果我使用您发布的代码,它会给出很多 __clrcall cannot be used on functions compiled to native code 错误,这让我认为它仍然将 foo.h 视为 CLR 代码。我认为将 managed 更改为 unmanaged 会有所帮助,但随后它将:cannot compile unmanaged function with /clr:pure or /clr:safe 添加到所有这些实例中。
  • 您的代码没有任何纯粹或安全的地方,您需要使用普通的 /clr 进行编译。
  • 我试过了,它奏效了。非常感谢!现在我很困惑为什么this 网站提供了如此复杂的解决方案... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多