Windows编译sick_safetyscanners_base遇msbuild D8021错误求助
解决Windows10下编译sick_safetyscanners_base库的问题
一、正确的Windows编译流程(核心)
Windows下优先使用VS2022原生编译链,不要强行套用Linux的Makefile流程,步骤如下:
- 打开VS2022开发者PowerShell/命令提示符(必须用这个,它会自动配置VS编译环境)
- 清空build目录下的所有缓存文件(避免之前的错误配置干扰)
- 执行CMake生成VS工程,手动指定Boost路径(解决组件找不到的问题):
cmake -G "Visual Studio 17 2022" -A x64 -DBoost_USE_STATIC_LIBS=ON -DBOOST_ROOT="你的Boost 1.80.0安装根目录" ..
-G "Visual Studio 17 2022":指定生成VS2022工程-A x64:编译64位版本(需和你安装的Boost架构一致,若装32位则改成Win32)-DBOOST_ROOT:手动指定Boost根目录,确保CMake能找到所需组件
二、逐个解决你遇到的问题
问题1:make -j8报错"No targets specified and no makefile found"
- 本质原因:Windows原生不支持GNU Make,且你之前的CMake默认生成的是VS工程,不是Makefile,自然找不到编译目标。
- 解决:完全放弃
make命令,改用VS的编译工具(msbuild或直接打开VS工程)。
问题2:msbuild报错"command line error D8021: invalid numeric argument /Werror"
- 原因:
/Werror是GCC的编译参数(将警告视为错误),但MSVC不识别该参数,CMake生成工程时误传入了跨平台不兼容的编译选项。 - 解决:在CMake命令中替换成MSVC兼容的参数,重新生成工程后再编译:
- 重新执行CMake,添加MSVC的警告参数:
cmake -G "Visual Studio 17 2022" -A x64 -DBoost_USE_STATIC_LIBS=ON -DBOOST_ROOT="你的Boost路径" -DCMAKE_CXX_FLAGS="/WX" ..
(/WX是MSVC对应-Werror的参数,若不需要将警告当错误,可换成/W0关闭警告)
2. 执行msbuild编译(并行编译用/m:8对应-j8):
msbuild sick_safetyscanners_base.sln /p:Configuration=Release /m:8
问题3:指定"Unix Makefiles"时找不到Boost组件
- 原因:该生成器会寻找MinGW/WSL环境下的Boost,而你安装的是针对MSVC的Windows版Boost,二者不兼容,没必要在Windows下折腾Unix编译链。
- 解决:直接使用前面推荐的VS2022生成器,配合
BOOST_ROOT参数,CMake就能正确识别Boost的system、thread、chrono组件。
三、验证安装与后续使用
编译完成后:
- 静态库文件(
.lib)会生成在build/Release(或Debug)目录下 - 头文件位于原仓库的
include目录中
在你的C++项目中调用时,需:
- 在IDE中添加头文件搜索路径,指向仓库的
include文件夹 - 添加库文件搜索路径,指向
build/Release文件夹 - 链接对应的
.lib库文件
内容的提问来源于stack exchange,提问作者aderk
相关产品推荐
相关产品推荐

