Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

srpc在windows上的编译流程参考 #221

Open
luciouskami opened this issue May 18, 2022 · 37 comments
Open

srpc在windows上的编译流程参考 #221

luciouskami opened this issue May 18, 2022 · 37 comments
Labels
documentation Improvements or additions to documentation

Comments

@luciouskami
Copy link
Contributor

luciouskami commented May 18, 2022

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

@Barenboim Barenboim added the documentation Improvements or additions to documentation label May 18, 2022
@luciouskami
Copy link
Contributor Author

luciouskami commented May 19, 2022

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

@flyleier
Copy link
Contributor

flyleier commented Jul 4, 2022

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
Copy link
Contributor

flyleier commented Jul 4, 2022

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

@Barenboim
Copy link
Contributor

在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
Copy link
Contributor

flyleier commented Jul 4, 2022

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

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

@holmes1412
Copy link
Contributor

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

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

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

@flyleier
Copy link
Contributor

flyleier commented Jul 5, 2022

你好~~~ 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注释,就没问题了

@holmes1412
Copy link
Contributor

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

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

@flyleier
Copy link
Contributor

flyleier commented Jul 6, 2022

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

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

是的,就是这句。

@holmes1412
Copy link
Contributor

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

@luciouskami
Copy link
Contributor Author

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

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

@luciouskami
Copy link
Contributor Author

在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
Copy link
Contributor

flyleier commented Jul 7, 2022

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

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

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

@Barenboim
Copy link
Contributor

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

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

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

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

@luciouskami
Copy link
Contributor Author

luciouskami commented Jul 7, 2022

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

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

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

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

@flyleier
Copy link
Contributor

flyleier commented Jul 7, 2022

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

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

@luciouskami
Copy link
Contributor Author

luciouskami commented Jul 8, 2022

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

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

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

@flyleier
Copy link
Contributor

flyleier commented Jul 8, 2022

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

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

@Barenboim
Copy link
Contributor

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

@Barenboim
Copy link
Contributor

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

@flyleier
Copy link
Contributor

flyleier commented Jul 8, 2022

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

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

@Barenboim
Copy link
Contributor

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

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

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

@luciouskami
Copy link
Contributor Author

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

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

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

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

@luciouskami
Copy link
Contributor Author

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

@Barenboim

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

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

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

@zh1an
Copy link

zh1an commented Oct 9, 2022

@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
Copy link

zh1an commented Oct 9, 2022

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

image

@jpsn123
Copy link

jpsn123 commented Oct 13, 2022

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()当成宏来处理。

if (bucket_boundary != std::numeric_limits<double>::max())

我临时做法:

#ifdef _MSC_VER
#pragma push_macro("max")
#undef max
#endif
.
.
.
#ifdef _MSC_VER
#pragma pop_macro("max")
#endif

希望开发者修正。
@holmes1412

@holmes1412
Copy link
Contributor

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()当成宏来处理。

if (bucket_boundary != std::numeric_limits<double>::max())

我临时做法:

#ifdef _MSC_VER
#pragma push_macro("max")
#undef max
#endif
.
.
.
#ifdef _MSC_VER
#pragma pop_macro("max")
#endif

希望开发者修正。
@holmes1412

感谢^^我改一下~

@akjay
Copy link

akjay commented Mar 8, 2023

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

@Barenboim
Copy link
Contributor

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

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

@akjay
Copy link

akjay commented Mar 9, 2023

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

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

按照这个说明文档可以编译成功,但是网络不稳定,vcpkg下载经常中断。自行从源码编译几个依赖库的时候到最后配置srpc的cmake总是失败。

@akjay
Copy link

akjay commented Mar 9, 2023

另外编译srpc_generator的时候Windows下似乎缺少getopt.h/c,所以编译的时候会失败,需要添加一个getopt.h/c文件到工程中。

@holmes1412
Copy link
Contributor

另外编译srpc_generator的时候Windows下似乎缺少getopt.h/c,所以编译的时候会失败,需要添加一个getopt.h/c文件到工程中。

感谢,这个我今天加一下~

@EvainGGbond
Copy link

编译srpc时报这个错
D:\GithubProjects\srpc\src\module\rpc_module.cc(168,7): error C3861: “strcasecmp”: 找不到标识符 [D:\GithubProjects\srpc\build
32\src\module\module.vcxproj]
D:\GithubProjects\srpc\src\module\rpc_module.cc(176,12): error C3861: “strcasecmp”: 找不到标识符 [D:\GithubProjects\srpc\buil
d32\src\module\module.vcxproj]
D:\GithubProjects\srpc\src\module\rpc_trace_module.cc(152,7): error C3861: “strcasecmp”: 找不到标识符 [D:\GithubProjects\srpc
\build32\src\module\module.vcxproj]
D:\GithubProjects\srpc\src\module\rpc_trace_module.cc(157,12): error C3861: “strcasecmp”: 找不到标识符 [D:\GithubProjects\srp
c\build32\src\module\module.vcxproj]

@holmes1412
Copy link
Contributor

@EvainGGbond 你好,谢谢提醒,这两个新加的模块忘了给cmake加上windows的编译定义了,刚提交了个Pull Request修复:#338

你也可以先从我的fork上:https://github.com/holmes1412/srpc/tree/master,拉取新代码看看这次修改是否是否还有问题,感谢~ 这个Pull Request我们也会很快merge。

@EvainGGbond
Copy link

@EvainGGbond 你好,谢谢提醒,这两个新加的模块忘了给cmake加上windows的编译定义了,刚提交了个Pull Request修复:#338

你也可以先从我的fork上:https://github.com/holmes1412/srpc/tree/master,拉取新代码看看这次修改是否是否还有问题,感谢~ 这个Pull Request我们也会很快merge。

嗯呐,我自己在源码里面加上重新编译过了

@holmes1412
Copy link
Contributor

嗯呐,我自己在源码里面加上重新编译过了

好的~因为Windows我没有编译环境,所以容易有所遗漏~如果还发现其他问题也非常欢迎提PR修复~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

8 participants