debugging - 如何在 Windows 下支持 grpc 的 Debug 和 Release 构建
问题描述
遵循源文档中的 grpc 构建,并使用默认的 Win32 发布目标安装了系统范围的 grpc 构建。在调试模式下编译客户端/服务器时,我得到链接器不匹配(MD_DynamicRelease 与 MDd_DynamicDebug 不匹配)。
但是,当我构建和安装 Win32 调试目标时,安装程序会覆盖具有相同名称的发布库,因此我遇到了相同的问题,所有发布客户端/服务器代码都无法链接。
创建和部署 grpc 的发布和调试版本的正确方法是什么?
解决方案
我面临同样的问题,我看到至少两种可能的解决方案:
使用git 子模块(或几乎等同于FetchContent 方法),即通过
add_subdirectory
命令将 grpc 代码直接添加到 CMakeLists.txt 中。这是最简单的方法,因为 CMake 会根据当前构建类型链接适当的 C 运行时库;但是,您会发现项目树中包含的所有 grpc 代码和目标;构建和安装 grpc 两次,一次在 Release 中(或 RelWithDebInfo,如果您愿意),一次在 Debug 模式下,针对两个不同的安装文件夹。像这样的东西(我使用 Ninja 作为构建系统和 MSVC 作为编译器):
rem Run from grpc directory after cloning the repo with --recursive or updating submodules. call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat" cd cmake rem Building x64 Release mkdir build_x64_Release cd build_x64_Release cmake ..\.. -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\..\install\x64\Release cmake --build . cmake --install . rem Building x64 Debug cd .. mkdir build_x64_Debug cd build_x64_Debug cmake ..\.. -GNinja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=..\..\install\x64\Debug cmake --build . cmake --install .
此后,您可以独立链接两个不同的版本,用于项目的调试和发布版本。使用 CMake,您需要将
CMAKE_PREFIX_PATH
变量设置为您刚刚构建的 Debug 或 Release grpc 安装文件夹的位置。如果您在 Visual Studio 中使用 CMake 集成,则可以CMAKE_PREFIX_PATH
在文件中添加正确的变量定义CMakeSettings.json
,如下所示{ "configurations": [ { "name": "x64-Debug", "generator": "Ninja", "configurationType": "Debug", "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${projectDir}\\out\\build\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}", "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=C:\\Dev\\grpc\\install\\x64\\Debug" }, { "name": "x64-Release", "generator": "Ninja", "configurationType": "RelWithDebInfo", "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${projectDir}\\out\\build\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}", "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=C:\\Dev\\grpc\\install\\x64\\Release" } ] }
请注意,如果您的项目不使用 CMake 作为构建系统,则必须根据您的构建系统调整解决方案 2. 的第二部分(即设置正确的包含目录、库引用和 protoc 预构建步骤)。
推荐阅读
- html - 输入字段只读而不使输入插件按钮只读
- python - 寻找 K 的最优值
- java - 如何在 Dropwizard 中使用 Quartz 调度程序进行 REST 调用?
- java - 用下一个替换元音不起作用
- docker - Docker Compose: Django, uWSGI, NGINX without Proxy (不同的容器)
- java - JUnit 要执行的方法列表
- angular - 使用 ViewChildren 访问子组件的指令
- java - 我们可以从 Java 中的 Future 对象中获取 Callable 对象吗?
- android - 带有编辑文本的自定义工具栏布局
- regex - 带制表符的正则表达式 \t