LNK2001:我的boost库(可能)构建不正确

我决定将我的boost库从1.61更新到1.63,并且在我更新使用新文件的项目中,我收到了一些我之前没有看到的新错误消息:

error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" (?system_category@system@boost@@YAAEBVerror_category@12@XZ)
error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (?generic_category@system@boost@@YAAEBVerror_category@12@XZ)

由于我的1.63库正在使用Visual Studio 2017进行编译,所以我的第一个假设是我编译boost库时出错了,所以下面是我从整理boost文件解压缩到的全部步骤:

  • 开始菜单→Visual Studio 2017 RC→开发人员命令提示符
  • 我改变目录直到我进入高级别的boost_1_63_0文件夹。
  • 我运行bootstrap.bat
  • 我打开project-config.jam进行编辑
  • using msvc ;更改using msvc ; using msvc : 14.1 : E:Program FilesMicrosoft Visual StudioVCToolsMSVC14.10.24911binHostX64x64;
  • 我打开boost/config/auto_link.hpp进行编辑
  • 我对这个文件进行编辑(列表后面列出的代码)
  • 在打开的命令提示符中,我执行命令b2 architecture=x86 address-model=64 link=static threading=multi runtime-link=shared --build-type=complete stage --stagedir=stage/x64 -a
  • 它在最后以下面的消息完成(在列表之后列出)
  • 我试图用我的代码使用这些库,使用#define BOOST_LIB_DIAGNOSTIC来跟踪正在使用的文件(它们是)。
  • 我尝试编译使用boost.asio的项目,并获取上面列出的两个未解析的外部符号错误。
  • 有谁知道我的错误在哪里? 如果我在Visual Studio 2017 RC中使用Visual Studio 2015编译的boost 1.61库,则不会发生这些错误。

    auto_link.hpp(旧):

    # elif defined (BOOST_MSVC)
    
         // vc14:
    #  define BOOST_LIB_TOOLSET "vc140"
    

    auto_link.hpp(新):

    # elif defined (BOOST_MSVC) && (BOOST_MSVC < 1910)
    
         // vc14:
    #  define BOOST_LIB_TOOLSET "vc140"
    
    # elif defined (BOOST_MSVC)
    
         // vc15:
    #  define BOOST_LIB_TOOLSET "vc141"
    

    boost编译过程结束时的消息:

    ...failed updating 6 targets...
    ...skipped 4 targets...
    ...updated 904 targets...
    

    使用#define BOOST_LIB_DIAGNOSTIC显示的库:

    1>Linking to lib file: libboost_system-vc141-mt-1_63.lib
    1>Linking to lib file: libboost_date_time-vc141-mt-1_63.lib
    1>Linking to lib file: libboost_regex-vc141-mt-1_63.lib
    

    让我知道是否还有其他需要的诊断信息。 我试着评论boost.asio库的各种用法,但只是删除标头完全消除了这些问题(当然,这使得boost组件无法使用)。


    这似乎与使用Boost :: asio的LNK 2019错误类似,因为您有相同的错误。

    我刚刚安装了VS2017RC并提升了1.63。 然后我使用这个描述:使用msvc 14.1(VS2017 RC)构建boost。 注意:你的线

    using msvc : 14.1 : E:Program FilesMicrosoft Visual StudioVCToolsMSVC14.10.24911binHostX64x64;
    

    应该可能包含“cl.exe”和引号。

    using msvc : 14.1 : "E:Program FilesMicrosoft Visual StudioVCToolsMSVC14.10.24911binHostX64x64cl.exe";
    

    ...他们应该实施一个进度条或这样的;)猜猜看:

    ...failed updating 6 targets...
    ...skipped 4 targets...
    ...updated 1214 targets...
    

    所以看看错误信息:

    msvc.compile.asm bin.v2libscontextbuildmsvc-14.1debugaddress-model-64link-staticthreading-multiasmmake_x86_64_ms_pe_masm.obj
    'ml64' is not recognized as an internal or external command, operable program or batch file.
    ml64 -nologo -c -Zp4 -Cp -Cx -DBOOST_ALL_NO_LIB=1 -DBOOST_CONTEXT_EXPORT= -DBOOST_CONTEXT_SOURCE -DBOOST_ALL_NO_LIB=1 -DBOOST_CONTEXT_EXPORT= -DBOOST_CONTEXT_SOURCE /Zi /Zd /W3  -Fo "bin.v2libscontextbuildmsvc-14.1debugaddress-model-64link-staticthreading-multiasmmake_x86_64_ms_pe_masm.obj" "libscontextsrcasmmake_x86_64_ms_pe_masm.asm"
    ...failed msvc.compile.asm bin.v2libscontextbuildmsvc-14.1debugaddress-model-64link-staticthreading-multiasmmake_x86_64_ms_pe_masm.obj...
    

    缺少64位依赖关系......所以,就像KindDragon在第二个链接中所说:

    从Windows开始菜单运行“VS 2017 RC的开发人员命令提示符”以从使用x86 vcvars或x64 vcvars配置的shell进行抢救

    有必要使用64位编译器变量来配置shell。

    cd "Program Files (x86)Microsoft Visual Studio 14.0VC"
    vcvarsall amd64
    

    ..或者,您可以从“开始”菜单启动x64本机环境: -> Visual Studio 201x -> Visual Studio Tools -> Windows Desktop Command Prompts -> VS201x x64 Native Tools Command Prompt

    然后再次建立。

    ...failed updating 2 targets...
    ...skipped 2 targets...
    ...updated 6 targets...
    

    有错误信息fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64' 。 所以需要重建。

    b2 --clean-all
    etc...
    

    ...你明白了。 但是,我现在看到博格丹也提到过这个评论。 那么,Kinddragon在Build boost中使用msvc 14.1(VS2017 RC)实际上是第一个;)

    链接地址: http://www.djcxy.com/p/95081.html

    上一篇: LNK2001: My boost libraries are (probably) built incorrectly

    下一篇: Why does nobody ever seem to write `delete &someObj`?