【问题标题】:How to use precompile header with boost::asio如何使用带有 boost::asio 的预编译头文件
【发布时间】:2012-05-27 23:07:09
【问题描述】:

我有一个项目有一些 main.cpp 和以下预编译头:

 <!-- language: lang-cpp -->
 #ifndef PRECOMPILE_H
 #define PRECOMPILE_H
 #include <iostream>
 #include <string>
 #include <vector>
 #include <boost\asio.hpp>
 #include <boost\bind.hpp>
 #include <boost\asio\ssl.hpp>
 #include <boost\locale.hpp>
 #include <boost\algorithm\string.hpp>
 #endif 

如果项目是*.lib,则始终正常构建。

如果项目是*.exe:
使用Create (/Yc) 构建时,一切正常。
当设置Use (/Yu) 我得到链接器错误 LNK2001:

1) 未解析的外部符号“私有:静态类 boost::asio::detail::tss_ptr::context> boost::asio::detail::call_stack::top_” (?top_@?$call_stack@Vstrand_impl @strand_service@detail@asio@boost@@E@detail@asio@boost@@0V?$tss_ptr@Vcontext@?$call_stack@Vstrand_impl@strand_service@detail@asio@boost@@E@detail@asio@boost@@ @234@A)

2) 未解析的外部符号 "public: static class boost::asio::detail::service_id boost::asio::detail::service_base::id" (?id@?$service_base@Vselect_reactor@detail@asio @boost@@@detail@asio@boost@@2V?$service_id@Vselect_reactor@detail@asio@boost@@@234@A)

3) 未解析的外部符号 "public: static class boost::asio::detail::service_id boost::asio::detail::service_base::id" (?id@?$service_base@Vstrand_service@detail@asio @boost@@@detail@asio@boost@@2V?$service_id@Vstrand_service@detail@asio@boost@@@234@A)

4) 未解析的外部符号 "public: static class boost::asio::detail::service_id >> boost::asio::detail::service_base >>::id" (?id@?$service_base@V ?$deadline_timer_service@Vptime@posix_time@boost@@U?$time_traits@Vptime@posix_time@boost@@@asio@3@@asio@boost@@@detail@asio@boost@@2V?$service_id@V?$最后期限_timer_service@Vptime@posix_time@boost@@U?$time_traits@Vptime@posix_time@boost@@@asio@3@@asio@boost@@@234@A)

提升:v1_49 静态/MTd

【问题讨论】:

  • 您在这里使用 PCH 的具体情况如何?您需要将预编译头文件构建输出的/Yc 目标文件与其余目标文件(使用/Yu 构建的目标文件)链接。请参阅此处了解类似问题:stackoverflow.com/questions/998881/…
  • 我不明白哪个对象必须链接到其他对象。澄清一下:当删除所有使用 asio 库的地方(从源代码和预编译头文件)并在预编译头文件中添加来自 boost 的其他内容(例如:boost::bind)时,一切正常。如果您查看错误 - 我们只有 asio 错误,其他包含文件 Visual Studio 可以看到并且工作正常。
  • 如果您的预编译头文件名为PCH.H,您还应该有一个PCH.CPP 文件,该文件使用/Yc 编译并链接(如PCH.OBJ)到您使用@ 编译的所有其他文件987654337@.
  • 非常感谢 Steve Townsend,它是有效的。你打开我的眼睛,救了我的命。现在我不明白为什么它在其他情况下也有效。
  • 好的,我已将其添加为将来参考的答案。很高兴听到它现在已经解决了。

标签: c++ visual-c++ linker boost-asio compilation-time


【解决方案1】:

如果您的预编译头文件名为PCH.H,您还应该有一个PCH.CPP 文件,该文件使用/Yc 编译并链接(作为PCH.OBJ)到您使用/Yu 编译的所有其他文件。

对于其他可行的情况,这可能是因为 Boost 头文件中的 static 不需要从预编译的头文件对象文件中导出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多