【问题标题】:Boost.asio in Visual C++ Form projectVisual C++ Form项目中的Boost.asio
【发布时间】:2012-06-22 05:11:48
【问题描述】:

我已经使用 boost.asio 在 Visual CLR 项目中成功实现了一个网络应用程序。但是当我尝试在 windows 窗体项目中使用 boost.asio 推荐的通用“语言运行时支持 (/clr)”时,它不起作用Error 15 error LNK2022: metadata operation failed (8013119F) : A TypeRef exists which should, but does not, have a corresponding TypeDef: (dummy): (0x01000019)

我的问题是如何在 windows 窗体项目中使用 boost.asio 集成我的网络代码。我现在要尝试的是在不同的项目中将所有 boost.asio 实现编译为“无公共语言运行时支持”作为动态库,并将其与 windows 窗体项目链接。

同时,如果你们中的任何人已经尝试过,请帮助我节省一些时间。

【问题讨论】:

  • “它不工作”不是一个很好的问题定义。
  • @Mohammad 我编辑了,谢谢。
  • 你也在使用 boost::thread 吗?

标签: c++ boost clr boost-asio boost-thread


【解决方案1】:

看来您正在使用 boost::thread。 根据this 错误报告、this 问题和我的个人经验,当静态链接时,boost::thread 将不适用于 C++/CLR 项目。你应该把它们放在一个非托管库中,然后使用那个库,就像你自己说的那样。

【讨论】:

  • 你的意思是我应该将 boost.asio 代码编译为 dll 并在 windows 窗体项目中使用 dll 吗?
  • 问题不在于boos::asio,而在于boost::thread。一种方法是动态链接到 boost::thread。另一种解决方案是在代码的 boost::thread 相关部分周围使用本机包装器。
  • 现在它正在正确重建,但是当我在 VS 中运行它时,表单没有显示出来。我猜主要没有加载。我尝试删除所有库,然后一一包含一些 boost 标头,当我包含“”时我发现只有它正在发生。不幸的是,没有错误或什么都没有。当我启动主要功能没有执行。你知道为什么会这样吗?
  • 通常包含标头不会改变运行时行为,所以我猜在包含 asio 之后,您也启用了一些代码更改。
  • 答案很清楚。您应该动态链接到 boost。 here's how.
【解决方案2】:

@ Mohammad 我想我想通了。我需要在一个空项目中手动添加表单,然后在其中包含 boost/asio。在 Windows 窗体项目中加载 boost/asio 它本身不起作用可能是因为预编译的头文件。现在我必须弄清楚提升线程问题。就像你说的,我会尝试你提出的方法并让你知道。

【讨论】:

  • 它确实有效。我已经用你的示例项目对其进行了测试。我提到的唯一问题是静态链接。
  • 它对你有用吗?但是当我在预处理器设置中添加“BOOST_ALL_DYN_LINK”时,我收到此错误“程序无法启动,因为您的计算机中缺少 boost_system-vc90-mt-gd-1_49.dll”但它实际上在“C:\ Boost\lib\i386" 目录。
  • 将该文件复制到您的 exe 文件旁边。
  • 谢谢@Mohammad。那行得通,所以我会将您的上一个答案标记为正确答案...您解决了我的愚蠢错误非常好。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多