srpc icon indicating copy to clipboard operation
srpc copied to clipboard

srpc在windows上的编译流程参考

Open luciouskami opened this issue 2 years ago • 37 comments

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的整个编译流程就结束了,可以尝试运行一下例子测试一下效果

luciouskami avatar May 18 '22 18:05 luciouskami

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

luciouskami avatar May 19 '22 07:05 luciouskami

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的问题。 这个问题如何解决?

flyleier avatar Jul 04 '22 03:07 flyleier

在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有关系吧?

flyleier avatar Jul 04 '22 04:07 flyleier

在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版是正常的吗?

Barenboim avatar Jul 04 '22 04:07 Barenboim

😓应该是为了快速解决问题给加的,肯定不好。 你现在单独使用workflow的Windows版是正常的吗?

正常的,我编译了workflow的tutorial,编译通过,运行也正常,只有编译srpc的tutorial编译出现错误。

flyleier avatar Jul 04 '22 05:07 flyleier

😓应该是为了快速解决问题给加的,肯定不好。 你现在单独使用workflow的Windows版是正常的吗?

正常的,我编译了workflow的tutorial,编译通过,运行也正常,只有编译srpc的tutorial编译出现错误。

你好~~~ srpc编译tutorial会报什么错呢?

holmes1412 avatar Jul 04 '22 16:07 holmes1412

你好~~~ 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 avatar Jul 05 '22 01:07 flyleier

@flyleier 你好,你说的是注释这行么?直接注释掉就好了?

108             string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")

holmes1412 avatar Jul 05 '22 13:07 holmes1412

@flyleier 你好,你说的是注释这行么?直接注释掉就好了?

108             string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")

是的,就是这句。

flyleier avatar Jul 06 '22 02:07 flyleier

@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了

holmes1412 avatar Jul 06 '22 11:07 holmes1412

@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了

不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦

luciouskami avatar Jul 07 '22 07:07 luciouskami

在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版是正常的吗?

应该没有更好的改法了,如果要控制运行库的话

luciouskami avatar Jul 07 '22 07:07 luciouskami

@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了

不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦

用的就是最新的cmake,运行库是要保持一致,我全部改成MD了,没啥问题,编译通过了。

flyleier avatar Jul 07 '22 08:07 flyleier

@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了

不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦

用的就是最新的cmake,运行库是要保持一致,我全部改成MD了,没啥问题,编译通过了。

能不能也帮我们提交一个PR?

Barenboim avatar Jul 07 '22 09:07 Barenboim

@flyleier 问了下小伙伴,这是cmake版本的问题,你可以尝试新点的cmake就不会编译错误了

不是这个问题,我昨天没看issue,不好意思。他这个显然就是tutorial与srpc或者workflow的运行库不一致导致的。 看他这个报错就是运行库里的,修改成一致的就行啦

用的就是最新的cmake,运行库是要保持一致,我全部改成MD了,没啥问题,编译通过了。

默认就是MD,产生上述错误的情况是因为其中一个库的运行库和其他不一致,如果你全都改为MT也没有问题

luciouskami avatar Jul 07 '22 10:07 luciouskami

默认就是MD,产生上述错误的情况是因为其中一个库的运行库和其他不一致,如果你全都改为MT也没有问题

是的,默认就是MD,因为workflow也是依赖MD的运行库,所以srpc我也改成了MD,如果要全改MT,那么也得改workflow了。 @Barenboim pr提交了

flyleier avatar Jul 07 '22 14:07 flyleier

默认就是MD,产生上述错误的情况是因为其中一个库的运行库和其他不一致,如果你全都改为MT也没有问题

是的,默认就是MD,因为workflow也是依赖MD的运行库,所以srpc我也改成了MD,如果要全改MT,那么也得改workflow了。 @Barenboim pr提交了

你这个改的不对呀, 这么改不是把我加的特性完全抹掉了吗?我上个pr已经修复了这个问题了。

luciouskami avatar Jul 08 '22 04:07 luciouskami

你这个改的不对呀, 这么改不是把我加的特性完全抹掉了吗?我上个pr已经修复了这个问题了。

对的,我已经编译通过了。首先,我们的目标是一致的,让srpc和workflow的运行库一致,我改的是srpc,你提交的pr是workflow的。不能说,和你不一致就是不对的,其次,在这个issue下面你没说你已经提交pr了,大家都是想让这个项目变得更好,如果你说你提交pr了,我肯定不会再改了,下次说清楚点。

flyleier avatar Jul 08 '22 05:07 flyleier

只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。

Barenboim avatar Jul 08 '22 05:07 Barenboim

我也拉我们的Windows开发,问一下怎么做合理一点。@dengjunplusplus

Barenboim avatar Jul 08 '22 05:07 Barenboim

只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。

@Barenboim 是的,我就是表述下,我提交pr只是想让项目变得更好。 这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。

flyleier avatar Jul 08 '22 06:07 flyleier

只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。

@Barenboim 是的,我就是表述下,我提交pr只是想让项目变得更好。 这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。

好的好的,感谢哈。都怪我们Windows上支持力量不够,靠大家改进了。

Barenboim avatar Jul 08 '22 07:07 Barenboim

只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。

@Barenboim 是的,我就是表述下,我提交pr只是想让项目变得更好。 这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。

好的好的,感谢哈。都怪我们Windows上支持力量不够,靠大家改进了。

应该是用的场景少,然后改法有点粗糙,我才那么说的。

luciouskami avatar Jul 08 '22 15:07 luciouskami

只讨论技术哈。大家都是我们的热心用户,不存在谁不让别人继续改的问题😂 我们暂时回滚了上一个修改,不是说改的不对哈,只有再讨论一下有没有什么问题。

@Barenboim

是的,我就是表述下,我提交pr只是想让项目变得更好。

这是误会,遇到编译错误的时候,就怀疑workflow的CMakeList中的if (SRPC_TUTORIAL_BUILD_STATIC_RUNTIME)这句有问题,感觉是crtl+v的时候没有更改,我贴出来,你说是快速解决问题加的,所以我只能改srpc了,现在看了下workflow的提交历史,现在这句做了修改,问题能解决就好。

我的意思是,在修改之前,先读一下原来的代码,不过我确实在提交的时候犯了低级错误。你遇到的这个问题,我也遇到过,我认为解决问题应该从整体出发,而不是头痛医头,脚痛医脚。,我之前的pr是针对两个项目的,运行库的设置在windows上是比较重要的。

luciouskami avatar Jul 08 '22 15:07 luciouskami

@luciouskami 在 Windows 10 上使用 vcpkg 编译 srpc 存在以下几点问题。

  1. 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.
  1. 另外,在 Windows 上编译的 srpc,怎么会产生 libsrpc.so 呢? image

zh1an avatar Oct 09 '22 06:10 zh1an

@luciouskami 另外说一下,我看了具体的链接过程,牵扯到 vcpkg 使用其他的库,链接时是这样的,vcpkg_installed\x64-windows\debug\lib\libssl.lib, 是带有路径的,但是,牵扯到 vcpkg 使用的 srpc 的库,链接时却是这样的,srpc.lib。没有带路径。这应该是因为 cmake 模块的文件有问题。

image

zh1an avatar Oct 09 '22 06:10 zh1an

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

jpsn123 avatar Oct 13 '22 03:10 jpsn123

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

感谢^^我改一下~

holmes1412 avatar Oct 13 '22 03:10 holmes1412

Windows版本的编译太难了,简直是劝退的节奏

akjay avatar Mar 08 '23 15:03 akjay

Windows版本的编译太难了,简直是劝退的节奏

公司里都是linux环境。Windows没有专职的开发。不好意思。群里有不少Windows用户,可以问问。

Barenboim avatar Mar 08 '23 15:03 Barenboim