srpc
srpc copied to clipboard
srpc在windows上的编译流程参考
0.编译前的准备:
从CMake的官网下载CMake的二进制文件并安装,建议CMake版本 >= 3.6
我们假设您当前的路径为:E:/GitHubProjects
由于一些原因,我建议您使用vcpkg来安装依赖项
打开Powershell/cmd/bash,拉取vcpkg,并安装依赖项:
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
# 安装依赖项
# win32
.\vcpkg.exe install zlib:x86-windows protobuf:x86-windows openssl:x86-windows snappy:x86-windows lz4:x86-windows
# amd64
.\vcpkg.exe install zlib:x64-windows protobuf:x64-windows openssl:x64-windows snappy:x64-windows lz4:x64-windows
# 之所以要指定架构并分别安装两个架构的库的原因是因为vcpkg有迷之bug会导致cmake找不到包
# 注意!不推荐将vcpkg全局集成,这会导致vcpkg的包污染您的项目,如果您希望集成vcpkg的包到某一个项目,请您使用nuget的本地仓库
1.编译源代码:
从官方仓库拉取代码,并编译:
# 回到上一级目录
cd ..
git clone --recursive https://github.com/sogou/srpc.git
cd srpc
cd workflow
# 将workflow切换到windows分支
git checkout windows
#使用cmake生成vs解决方案,我当前的环境是cmake 3.23.0,visual studio 2022
# 编译32位版本
cmake -B build32 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A Win32
cmake --build build32 --config Debug
cmake --build build32 --config Release
# 编译64位版本
cmake -B build64 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A x64
cmake --build build64 --config Debug
cmake --build build64 --config Release
接下来编译srpc:
# 回到上一级目录
cd ..
# 编译32位版本
cmake -B build32 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A Win32
cmake --build build32 --config Debug
cmake --build build32 --config Release
# 编译64位版本
cmake -B build64 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A x64
cmake --build build64 --config Debug
cmake --build build64 --config Release
2.编译例子:
# 直接在srpc的目录下编译
# 编译32位版本
cmake -B buildt32 -S tutorial -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A Win32
cmake --build buildt32 --config Debug
cmake --build buildt32 --config Release
# 编译64位版本
cmake -B buildt64 -S tutorial -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A x64
cmake --build buildt64 --config Debug
cmake --build buildt64 --config Release
至此,windows上srpc的整个编译流程就结束了,可以尝试运行一下例子测试一下效果
0.Perpare:
Download CMake binary form their official site,the version minimun requriement is 3.6
We assume that your repo current path is "E:/GitHubProjects"
For several reasons, I recommend that you use vcpkg to install dependencies
Open your Powershell/cmd/bash and clone vcpkg, then install dependencies
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
# install dependencies
# win32
.\vcpkg.exe install zlib:x86-windows protobuf:x86-windows openssl:x86-windows snappy:x86-windows lz4:x86-windows
# amd64
.\vcpkg.exe install zlib:x64-windows protobuf:x64-windows openssl:x64-windows snappy:x64-windows lz4:x64-windows
# The reason to specify arch and install dependencies for both arches is because vcpkg has a bug that causes cmake unable to find packages
# Attention! It is not recommended to integrate vcpkg globally, as this will cause vcpkg packages to contaminate your project. If you want to integrate VCPKG packages into a project, use Nuget's local repository instead
1.Compile :
Clone the code from official repository:
# return to the previous path
cd ..
git clone --recursive https://github.com/sogou/srpc.git
cd srpc
cd workflow
# check out to 'windows' branch
git checkout windows
#using Cmake to generate the VS solution, my current environment is cmake 3.23.0,visual studio 2022
# build the 32-bit version
cmake -B build32 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A Win32
cmake --build build32 --config Debug
cmake --build build32 --config Release
# build the 64-bit version
cmake -B build64 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A x64
cmake --build build64 --config Debug
cmake --build build64 --config Release
Then compile srpc:
# return to the previous path
cd ..
# build the 32-bit version
cmake -B build32 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A Win32
cmake --build build32 --config Debug
cmake --build build32 --config Release
# build the 64-bit version
cmake -B build64 -S . -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A x64
cmake --build build64 --config Debug
cmake --build build64 --config Release
2.Compile Tutorials:
# compile directly in the srpc directory
# build the 32-bit version
cmake -B buildt32 -S tutorial -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A Win32
cmake --build buildt32 --config Debug
cmake --build buildt32 --config Release
# build the 64-bit version
cmake -B buildt64 -S tutorial -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A x64
cmake --build buildt64 --config Debug
cmake --build buildt64 --config Release
At this point, the entire compilation process for srpc on Windows is complete, and you can try running examples
2.编译例子:
# 直接在srpc的目录下编译 # 编译32位版本 cmake -B buildt32 -S tutorial -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A Win32 cmake --build buildt32 --config Debug cmake --build buildt32 --config Release # 编译64位版本 cmake -B buildt64 -S tutorial -DCMAKE_TOOLCHAIN_FILE=E:\GitHubProjects\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17" -A x64 cmake --build buildt64 --config Debug cmake --build buildt64 --config Release
至此,windows上srpc的整个编译流程就结束了,可以尝试运行一下例子测试一下效果
此步骤编译出现错误(展示一部分错误和警告):
LINK : warning LNK4286: 符号“__stdio_common_vsprintf”(在“libucrtd.lib(output.obj)”中定义)已由“workflow.lib(WFDnsResolver.obj)”导入 [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(http_parser.obj) : error LNK2019: 无法解析的外部符号 __imp_realloc,函数 http_parser_append_message 中引用了该符号 [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(dns_parser.obj) : error LNK2001: 无法解析的外部符号 __imp_realloc [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(CommScheduler.obj) : error LNK2001: 无法解析的外部符号 __imp_realloc [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(URIParser.obj) : error LNK2001: 无法解析的外部符号 __imp_realloc [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(URIParser.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(DnsTaskImpl.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(http_parser.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(DnsUtil.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(WFDnsClient.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(dns_parser.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
D:\dev\srpc\tutorial\Debug\trpc_pb_server.exe : fatal error LNK1120: 4 个无法解析的外部命令 [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
从错误提示来看,是MT 和 MD的问题。 这个问题如何解决?
在workflow项目里windows分支里查看了CMakeList.txt, 里面有几行代码:
if (WIN32)
if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
endforeach ()
endif ()
endif ()
if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题吗,workflow项目不至于和srpc的tutorial有关系吧?
在workflow项目里windows分支里查看了CMakeList.txt, 里面有几行代码:
if (WIN32) if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME) set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL ) foreach(CompilerFlag ${CompilerFlags}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") endforeach () endif () endif ()
if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题吗,workflow项目不至于和srpc的tutorial有关系吧?
😓应该是为了快速解决问题给加的,肯定不好。 你现在单独使用workflow的Windows版是正常的吗?
😓应该是为了快速解决问题给加的,肯定不好。 你现在单独使用workflow的Windows版是正常的吗?
正常的,我编译了workflow的tutorial,编译通过,运行也正常,只有编译srpc的tutorial编译出现错误。
😓应该是为了快速解决问题给加的,肯定不好。 你现在单独使用workflow的Windows版是正常的吗?
正常的,我编译了workflow的tutorial,编译通过,运行也正常,只有编译srpc的tutorial编译出现错误。
你好~~~ srpc编译tutorial会报什么错呢?
你好~~~ srpc编译tutorial会报什么错呢?
这种错误:
LINK : warning LNK4286: 符号“__stdio_common_vsprintf”(在“libucrtd.lib(output.obj)”中定义)已由“workflow.lib(WFDnsResolver.obj)”导入 [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(http_parser.obj) : error LNK2019: 无法解析的外部符号 __imp_realloc,函数 http_parser_append_message 中引用了该符号 [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(dns_parser.obj) : error LNK2001: 无法解析的外部符号 __imp_realloc [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(CommScheduler.obj) : error LNK2001: 无法解析的外部符号 __imp_realloc [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(URIParser.obj) : error LNK2001: 无法解析的外部符号 __imp_realloc [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(URIParser.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(DnsTaskImpl.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(http_parser.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(DnsUtil.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(WFDnsClient.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
workflow.lib(dns_parser.obj) : error LNK2001: 无法解析的外部符号 __imp__strdup [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
D:\dev\srpc\tutorial\Debug\trpc_pb_server.exe : fatal error LNK1120: 4 个无法解析的外部命令 [D:\dev\srpc\build_tutorial\trpc_pb_server.vcxproj]
是MT的问题,我把srpc和tutorial的CMakeList中关于MT注释,就没问题了
@flyleier 你好,你说的是注释这行么?直接注释掉就好了?
108 string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
@flyleier 你好,你说的是注释这行么?直接注释掉就好了?
108 string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
是的,就是这句。
@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了
@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了
不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦
在workflow项目里windows分支里查看了CMakeList.txt, 里面有几行代码:
if (WIN32) if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME) set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL ) foreach(CompilerFlag ${CompilerFlags}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") endforeach () endif () endif ()
if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题吗,workflow项目不至于和srpc的tutorial有关系吧?
😓应该是为了快速解决问题给加的,肯定不好。 你现在单独使用workflow的Windows版是正常的吗?
应该没有更好的改法了,如果要控制运行库的话
@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了
不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦
用的就是最新的cmake,运行库是要保持一致,我全部改成MD了,没啥问题,编译通过了。
@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了
不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦
用的就是最新的cmake,运行库是要保持一致,我全部改成MD了,没啥问题,编译通过了。
能不能也帮我们提交一个PR?
@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了
不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦
用的就是最新的cmake,运行库是要保持一致,我全部改成MD了,没啥问题,编译通过了。
默认就是MD,产生上述错误的情况是因为其中一个库的运行库和其他不一致,如果你全都改为MT也没有问题
默认就是MD,产生上述错误的情况是因为其中一个库的运行库和其他不一致,如果你全都改为MT也没有问题
是的,默认就是MD,因为workflow也是依赖MD的运行库,所以srpc我也改成了MD,如果要全改MT,那么也得改workflow了。 @Barenboim pr提交了
默认就是MD,产生上述错误的情况是因为其中一个库的运行库和其他不一致,如果你全都改为MT也没有问题
是的,默认就是MD,因为workflow也是依赖MD的运行库,所以srpc我也改成了MD,如果要全改MT,那么也得改workflow了。 @Barenboim pr提交了
你这个改的不对呀, 这么改不是把我加的特性完全抹掉了吗?我上个pr已经修复了这个问题了。
你这个改的不对呀, 这么改不是把我加的特性完全抹掉了吗?我上个pr已经修复了这个问题了。
对的,我已经编译通过了。首先,我们的目标是一致的,让srpc和workflow的运行库一致,我改的是srpc,你提交的pr是workflow的。不能说,和你不一致就是不对的,其次,在这个issue下面你没说你已经提交pr了,大家都是想让这个项目变得更好,如果你说你提交pr了,我肯定不会再改了,下次说清楚点。
只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。
我也拉我们的Windows开发,问一下怎么做合理一点。@dengjunplusplus
只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。
@Barenboim 是的,我就是表述下,我提交pr只是想让项目变得更好。 这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。
只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。
@Barenboim 是的,我就是表述下,我提交pr只是想让项目变得更好。 这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。
好的好的,感谢哈。都怪我们Windows上支持力量不够,靠大家改进了。
只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。
@Barenboim 是的,我就是表述下,我提交pr只是想让项目变得更好。 这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。
好的好的,感谢哈。都怪我们Windows上支持力量不够,靠大家改进了。
应该是用的场景少,然后改法有点粗糙,我才那么说的。
只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。
@Barenboim
是的,我就是表述下,我提交pr只是想让项目变得更好。
这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。
我的意思是,在修改之前,先读一下原来的代码,不过我确实在提交的时候犯了低级错误。你遇到的这个问题,我也遇到过,我认为解决问题应该从整体出发,而不是头痛医头,脚痛医脚。,我之前的pr是针对两个项目的,运行库的设置在windows上是比较重要的。
@luciouskami 在 Windows 10 上使用 vcpkg
编译 srpc
存在以下几点问题。
- 在
vcpkg
编译srpc
成功的情况下,程序无法 link。原因是 LINK : fatal error LNK1104: cannot open file 'srpc.lib'。以下是编译日志:
====================[ Clean | Debug-Visual Studio x64 ]=========================
D:\JetBrainSoftware\apps\CLion\ch-0\222.4167.35\bin\cmake\win\bin\cmake.exe --build F:\GEMSDK\gemsdk\cmake-build-debug-visual-studio-x64 --target clean -j 9
[1/1] Cleaning all built files...
Cleaning... 2 files.
Clean finished
====================[ Build | all | Debug-Visual Studio x64 ]===================
D:\JetBrainSoftware\apps\CLion\ch-0\222.4167.35\bin\cmake\win\bin\cmake.exe --build F:\GEMSDK\gemsdk\cmake-build-debug-visual-studio-x64 --target all -j 9
[1/3] Building CXX object CMakeFiles\GEMSDK.dir\source\hsmspackage.cpp.obj
[2/3] Building CXX object CMakeFiles\GEMSDK.dir\source\main.cpp.obj
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\RedisMessage.h(326): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\HttpMessage.h(60): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\HttpMessage.h(65): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\HttpMessage.h(98): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\HttpMessage.h(103): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\HttpMessage.h(108): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\HttpMessage.h(113): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\DnsMessage.h(153): warning C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strdup. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\string.h(532): note: see declaration of 'strdup'
f:\gemsdk\gemsdk\cmake-build-debug-visual-studio-x64\vcpkg_installed\x64-windows\include\workflow\DnsMessage.h(159): warning C4800: 'char': forcing value to bool 'true' or 'false' (performance warning)
[3/3] Linking CXX executable GEMSDK.exe
FAILED: GEMSDK.exe
cmd.exe /C "cd . && D:\JetBrainSoftware\apps\CLion\ch-0\222.4167.35\bin\cmake\win\bin\cmake.exe -E vs_link_exe --intdir=CMakeFiles\GEMSDK.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\x64\mt.exe --manifests -- C:\PROGRA~2\MICROS~1.0\VC\bin\amd64\link.exe /nologo CMakeFiles\GEMSDK.dir\source\hsmspackage.cpp.obj CMakeFiles\GEMSDK.dir\source\main.cpp.obj /out:GEMSDK.exe /implib:GEMSDK.lib /pdb:GEMSDK.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console vcpkg_installed\x64-windows\debug\lib\workflow.lib ws2_32.lib wsock32.lib vcpkg_installed\x64-windows\debug\lib\libssl.lib vcpkg_installed\x64-windows\debug\lib\libcrypto.lib srpc.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cmd.exe /C "cd /D F:\GEMSDK\gemsdk\cmake-build-debug-visual-studio-x64 && C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass -file E:/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary F:/GEMSDK/gemsdk/cmake-build-debug-visual-studio-x64/GEMSDK.exe -installedDir F:/GEMSDK/gemsdk/cmake-build-debug-visual-studio-x64/vcpkg_installed/x64-windows/debug/bin -OutVariable out""
LINK Pass 1: command "C:\PROGRA~2\MICROS~1.0\VC\bin\amd64\link.exe /nologo CMakeFiles\GEMSDK.dir\source\hsmspackage.cpp.obj CMakeFiles\GEMSDK.dir\source\main.cpp.obj /out:GEMSDK.exe /implib:GEMSDK.lib /pdb:GEMSDK.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console vcpkg_installed\x64-windows\debug\lib\workflow.lib ws2_32.lib wsock32.lib vcpkg_installed\x64-windows\debug\lib\libssl.lib vcpkg_installed\x64-windows\debug\lib\libcrypto.lib srpc.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\GEMSDK.dir/intermediate.manifest CMakeFiles\GEMSDK.dir/manifest.res" failed (exit code 1104) with the following output:
LINK : fatal error LNK1104: cannot open file 'srpc.lib'
ninja: build stopped: subcommand failed.
- 另外,在 Windows 上编译的
srpc
,怎么会产生libsrpc.so
呢?
@luciouskami 另外说一下,我看了具体的链接过程,牵扯到 vcpkg
使用其他的库,链接时是这样的,vcpkg_installed\x64-windows\debug\lib\libssl.lib
, 是带有路径的,但是,牵扯到 vcpkg
使用的 srpc
的库,链接时却是这样的,srpc.lib
。没有带路径。这应该是因为 cmake 模块的文件有问题。
C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(314,54): error C2589: “(”:“::”右边的非法标记 [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj]
C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(314): error C2062: 意外的类型“unknown-type” [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj]
C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(314,59): error C2059: 语法错误:“)” [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj]
C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(315,2): error C2143: 语法错误: 缺少“;”(在“{”的前面) [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj]
C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(319,2): error C2181: 没有匹配 if 的非法 else [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj]
编译时遇到以上错误,因为预处理器把这句话中max()当成宏来处理。 https://github.com/sogou/srpc/blob/6340b19a5f21b6d61f30eded199d80716004fe01/src/module/rpc_filter_metrics.cc#L314
我临时做法:
#ifdef _MSC_VER
#pragma push_macro("max")
#undef max
#endif
.
.
.
#ifdef _MSC_VER
#pragma pop_macro("max")
#endif
希望开发者修正。 @holmes1412
C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(314,54): error C2589: “(”:“::”右边的非法标记 [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj] C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(314): error C2062: 意外的类型“unknown-type” [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj] C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(314,59): error C2059: 语法错误:“)” [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj] C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(315,2): error C2143: 语法错误: 缺少“;”(在“{”的前面) [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj] C:\Users\Jpsn\Desktop\srpc\src\module\rpc_filter_metrics.cc(319,2): error C2181: 没有匹配 if 的非法 else [C:\Users\Jpsn\Desktop\srpc\build64\src\module\module.vcxproj]
编译时遇到以上错误,因为预处理器把这句话中max()当成宏来处理。
https://github.com/sogou/srpc/blob/6340b19a5f21b6d61f30eded199d80716004fe01/src/module/rpc_filter_metrics.cc#L314
我临时做法:
#ifdef _MSC_VER #pragma push_macro("max") #undef max #endif . . . #ifdef _MSC_VER #pragma pop_macro("max") #endif
希望开发者修正。 @holmes1412
感谢^^我改一下~
Windows版本的编译太难了,简直是劝退的节奏
Windows版本的编译太难了,简直是劝退的节奏
公司里都是linux环境。Windows没有专职的开发。不好意思。群里有不少Windows用户,可以问问。