【问题标题】:How to compile a C++/CLI program into .lib and link it with a pure unmanaged C++ program?如何将 C++/CLI 程序编译成 .lib 并将其与纯非托管 C++ 程序链接?
【发布时间】:2012-03-03 12:46:39
【问题描述】:

我正在关注这个http://www.codeproject.com/Articles/10020/Using-managed-code-in-an-unmanaged-application

该示例由 3 个二进制文件组成:

  1. C# 代码
  2. C++/CLI 代码
  3. C++ 代码

C++代码调用C++/CLI代码,CLI代码再调用C#代码,实现从C++运行C#代码的方式。

问题是,C++/CLI 被编译为 .dll,当我试图将它编译成 .lib 时,使 C++ 代码与 C++/CLI 代码链接在一起,它失败了。

这样最终结果将只包含 2 个二进制文件。

  1. C# 代码
  2. C++ --LINK-- C++/CLI 代码

错误

Error   1   error LNK2019: unresolved external symbol "__declspec(dllimport) public: static void __cdecl IMessageBoxWrapper::Destroy(class IMessageBoxWrapper *)" (__imp_?Destroy@IMessageBoxWrapper@@SAXPAV1@@Z) referenced in function _main  C:\Users\Zero\Desktop\UmanagedApp\UmanagedApp\main.obj  UmanagedApp

Error   2   error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class IMessageBoxWrapper * __cdecl IMessageBoxWrapper::CreateInstance(void)" (__imp_?CreateInstance@IMessageBoxWrapper@@SAPAV1@XZ) referenced in function _main C:\Users\Zero\Desktop\UmanagedApp\UmanagedApp\main.obj  UmanagedApp

【问题讨论】:

  • 在从 C++ 代码链接到 cli 库时尝试使用绝对路径名而不是相对路径名。
  • 感谢您的回复。我验证了 VS2010 可以正常读取 .lib。当我将 ManagedWrapper.lib 重命名为 ManagedWrapper1.lib 时表示无法读取 ManagedWrapper.lib。

标签: c# c++ interop c++-cli mixed-mode


【解决方案1】:

由于您不再拥有 DLL,因此您根本不应该使用 __declspec(dllimport)

实际上,我强烈反对在任何情况下在类上使用它,它非常脆弱。

所以只需从所有类定义中删除DLLAPI

【讨论】:

  • __declspec(dllimport) 过时了吗?我意识到这些缺点(我亲眼目睹了它们),但近 10 年前,当我每天使用它们时,它们是事实上的标准(尽管在不太了解的情况下是不必要的)。是否有新的髋关节等价物?
  • @M.Babcock:它适用于具有一致 ABI 的 extern "C" 函数。但是类和类成员没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多