【问题标题】:Boost linker error: Unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_system_category(void)"Boost 链接器错误:未解析的外部符号“class boost::system::error_category const & __cdecl boost::system::get_system_category(void)”
【发布时间】:2010-11-07 03:42:50
【问题描述】:

我刚刚开始第一次使用 Boost,详情:

  1. 我使用的是 Visual Studio 2008 SP1
  2. 我正在进行 x64 构建
  3. 我只使用 boost::asio(以及它所具有的任何依赖项)

我的代码现在可以编译,我将我的项目指向 boost 库(在构建 x64 库之后)并解决了一些简单的问题,现在我面临一个链接器错误:

2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_system_category(void)" (?get_system_category@system@boost@@YAAEBVerror_category@12@XZ)
2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_generic_category(void)" (?get_generic_category@system@boost@@YAAEBVerror_category@12@XZ)

有什么想法吗?


我添加了这个定义:#define BOOST_LIB_DIAGNOSTIC

现在在我的输出中我看到了这个:

1>Linking to lib file: libboost_system-vc90-mt-1_38.lib
1>Linking to lib file: libboost_date_time-vc90-mt-1_38.lib
1>Linking to lib file: libboost_regex-vc90-mt-1_38.lib

这似乎表明它实际上是在系统库中链接。

【问题讨论】:

    标签: c++ windows 64-bit boost-asio


    【解决方案1】:

    我解决了这个问题。当我打算构建 64 位库时,我已经构建了 32 位库。我修正了我的构建语句,并构建了 64 位库,现在它可以工作了。

    这是我的 bjam 命令行:

    C:\Program Files (x86)\boost\boost_1_38>bjam --build-dir=c:\boost --build-type=complete --toolset=msvc-9.0 address-model=64 architecture=x86 --with-system
    

    【讨论】:

    • 您可以使用以下方法测试您的库是否适用于正确的平台:stackoverflow.com/questions/6014107/…
    • 在地址模型之前,我有一个不应该存在的“-”。
    • 这是找到我的错误的一个很好的灵感,我处于一个有点镜像的情况,我将 boost 库构建为 x64,但正在构建一个新的应用程序作为 Win32 并尝试链接到构建为的库x64。我忘记了 Visual Studio 中的模板项目会创建插入到 ConfigurationManager 中的默认配置,而不是假设当前的解决方案配置是什么。
    【解决方案2】:
    #include <boost/system/config.hpp>
    

    在我的例子中,BOOST_LIB_DIAGNOSTIC 没有显示系统正在自动链接。我通过简单地包含 boost/system/config.hpp 解决了这个问题。

    【讨论】:

    • 它也对我有用(在 VS 2015 中,提升 1.64)。但为什么呢?
    【解决方案3】:

    你需要在 boost_system 库中链接

    【讨论】:

    • 它不会自动链接进来吗?其他图书馆似乎。链接它的正确方法是什么? (考虑到图书馆等的所有变体)
    • 有趣的是,我得到的第一个错误是:致命错误 LNK1104:无法打开文件“libboost_system-vc90-mt-1_38.lib”。然后我确保该库位于 lib 路径中,然后它就消失了。
    • 在您的项目设置中添加导入库 (boost_system.??.lib)。
    • 我将 libboost_system-vc90-mt-1_38.lib 添加到我的库列表中,同样的错误。
    【解决方案4】:

    我遇到了同样的问题。我尝试了上述所有方法,但没有任何帮助。解决方案很简单:首先我使用了一个空项目,并且出现了链接器错误 LNK2019。但是当我使用 stdafx.h、targetver.h 和 stdafx.cpp 文件创建新的默认 Win32 控制台应用程序时,一切正常。可能对某人有用,我花了两天时间

    【讨论】:

      【解决方案5】:

      如果您在项目中使用 boost::system,则应使用并指定 x86 或 x64 版本的 boost::system 库。

      您可以使用以下批处理文件重新编译 Boost 库。将这些保存到 Boost 根文件夹并在 CMD Windows 中运行(不要双击!):

      call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86
      
      
      cd boost_1_60_0
      call bootstrap.bat
      
      rem Most libraries can be static libraries
      b2 -j8 toolset=msvc-14.0 address-model=64 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/x64
      b2 -j8 toolset=msvc-14.0 address-model=32 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/win32
      
      pause
      

      更多详情可以看这篇文章:https://studiofreya.com/2015/12/19/how-to-build-boost-1-60-with-visual-studio-2015/

      【讨论】:

        【解决方案6】:

        我是通过搜索链接器错误和 CMAKE 来提出这个问题的,所以我在此处添加此评论,以防其他人以同样的方式发现此问题。

        事实证明,在我的情况下,链接器错误是由于错误造成的:

            add_definitions(-DBOOST_ALL_DYN_LINK)
        

        CMakeLists.txt 中,这适用于 Unix,但在我的情况下不适用于 Windows。解决方案不是在 Windows 上使用该定义。

        【讨论】:

          【解决方案7】:

          我需要两个版本并使用舞台目标,所以我使用 --stagedir=./stageX86 用于 x86 版本和默认 ./stage 用于 x64

          【讨论】:

            【解决方案8】:

            我也是因为这个链接器错误加上 CMake 而来到这里的,但在我的情况下,默认情况下 CMake 将尝试使用 32 位构建。通过指定 -Ax64

            已解决此问题
            cmake -Ax64 {path to CMakeLists.txt}
            

            【讨论】:

              【解决方案9】:

              之前在这个线程中给出的方法都不适用于我。 然后我检查了boost系统文件夹中的文件并在#define下面尝试了

              #define BOOST_ERROR_CODE_HEADER_ONLY

              使用后链接错误解决。

              【讨论】:

                【解决方案10】:

                就我而言,我通过将 boost include 目录从

                移动来解决了这个问题
                Project -> Properties-> VC++ Directories -> Include Directories
                

                Project -> Properties-> C/C++ -> General -> Additional Include Directories
                

                ,并从

                移动 boost lib 目录
                Project -> Properties-> VC++ Directories -> Library Directories
                

                Project -> Properties-> Linker -> General -> Additional Library Directories
                

                可能错误是由链接顺序引起的。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-04-12
                  • 1970-01-01
                  • 2021-03-30
                  • 2014-06-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多