LNK2001:我的 boost 库(可能)构建不正确
LNK2001: My boost libraries are (probably) built incorrectly
我决定将我的 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 库时犯了一个错误,所以这里是我从干净解压缩中采取的总步骤提升文件的数量:
- 开始菜单→Visual Studio 2017 RC→开发者命令提示符
- 我更改目录,直到进入 high-level
boost_1_63_0
文件夹。
- 我运行
bootstrap.bat
- 我打开
project-config.jam
进行编辑
- 我把
using msvc ;
改成using msvc : 14.1 : E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC.10.24911\bin\HostX64\x64\;
- 我打开
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 库的各种用途,但仅删除 header 就完全消除了这些问题(当然,这使得 boost 组件无法使用)。
这似乎与 LNK 2019 error using Boost::asio 相似,因为您有相同的错误。
我刚刚安装了 VS2017RC 和 boost 1.63。然后我使用了这个描述:Build boost with msvc 14.1 ( VS2017 RC)
.注意:你的行
using msvc : 14.1 : E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC.10.24911\bin\HostX64\x64\;
可能应该包括 "cl.exe" 和引号。
using msvc : 14.1 : "E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC.10.24911\bin\HostX64\x64\cl.exe";
...他们应该实现一个进度条之类的;)
猜猜看:
...failed updating 6 targets...
...skipped 4 targets...
...updated 1214 targets...
于是看报错信息:
msvc.compile.asm bin.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_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.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_x86_64_ms_pe_masm.obj" "libs\context\src\asm\make_x86_64_ms_pe_masm.asm"
...failed msvc.compile.asm bin.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_x86_64_ms_pe_masm.obj...
缺少 64 位依赖项...所以,就像 KindDragon 在第二个 link 中所说的那样:
Run "Developer Command Prompt for VS 2017 RC" from Windows Start Menu to boostrap from a shell configured using the x86 vcvars or x64 vcvars.
需要使用 64 位编译器变量配置 shell。
cd "\Program Files (x86)\Microsoft Visual Studio 14.0\VC"
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...
...你明白了。但我现在似乎在评论中看到 Bogdan 也提到了这一点。好吧,Build boost with msvc 14.1 ( VS2017 RC) 中的 Kinddragon 实际上是第一个 ;)
我决定将我的 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 库时犯了一个错误,所以这里是我从干净解压缩中采取的总步骤提升文件的数量:
- 开始菜单→Visual Studio 2017 RC→开发者命令提示符
- 我更改目录,直到进入 high-level
boost_1_63_0
文件夹。 - 我运行
bootstrap.bat
- 我打开
project-config.jam
进行编辑 - 我把
using msvc ;
改成using msvc : 14.1 : E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC.10.24911\bin\HostX64\x64\;
- 我打开
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 库的各种用途,但仅删除 header 就完全消除了这些问题(当然,这使得 boost 组件无法使用)。
这似乎与 LNK 2019 error using Boost::asio 相似,因为您有相同的错误。
我刚刚安装了 VS2017RC 和 boost 1.63。然后我使用了这个描述:Build boost with msvc 14.1 ( VS2017 RC) .注意:你的行
using msvc : 14.1 : E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC.10.24911\bin\HostX64\x64\;
可能应该包括 "cl.exe" 和引号。
using msvc : 14.1 : "E:\Program Files\Microsoft Visual Studio\VC\Tools\MSVC.10.24911\bin\HostX64\x64\cl.exe";
...他们应该实现一个进度条之类的;) 猜猜看:
...failed updating 6 targets...
...skipped 4 targets...
...updated 1214 targets...
于是看报错信息:
msvc.compile.asm bin.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_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.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_x86_64_ms_pe_masm.obj" "libs\context\src\asm\make_x86_64_ms_pe_masm.asm"
...failed msvc.compile.asm bin.v2\libs\context\build\msvc-14.1\debug\address-model-64\link-static\threading-multi\asm\make_x86_64_ms_pe_masm.obj...
缺少 64 位依赖项...所以,就像 KindDragon 在第二个 link 中所说的那样:
Run "Developer Command Prompt for VS 2017 RC" from Windows Start Menu to boostrap from a shell configured using the x86 vcvars or x64 vcvars.
需要使用 64 位编译器变量配置 shell。
cd "\Program Files (x86)\Microsoft Visual Studio 14.0\VC"
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...
...你明白了。但我现在似乎在评论中看到 Bogdan 也提到了这一点。好吧,Build boost with msvc 14.1 ( VS2017 RC) 中的 Kinddragon 实际上是第一个 ;)