gRPC在Windows DLL构建中的问题与现状
gRPC作为一种流行的RPC框架,虽然在跨平台开发中表现出色,但在Windows平台上以DLL形式构建时存在诸多问题。以下是当前遇到的主要问题和现状:
问题一:DLL构建的官方支持不足
- 官方立场:gRPC官方并不推荐将gRPC C++作为DLL使用。Windows上不存在稳定的C++ ABI,这使得在不同DLL中安全地分配和释放内存变得极为困难。
- 测试缺失:gRPC团队没有为DLL构建设置广泛的测试,导致可能会出现回归问题或构建中断。
问题二:链接错误与符号问题
- 未解析的外部符号:在构建过程中,开发者可能会遇到未解析的外部符号错误,如
census_set_trace_mask
等。这是因为gRPC源代码中只声明了这些符号,但没有提供相应的实现。 - 符号数量限制:从gRPC 1.68版本开始,共享构建在Windows上无法完成,因为导出的符号数量超过了DLL格式的限制。
问题三:多DLL环境下的崩溃问题
- 静态代码副本冲突:当在多个DLL中使用gRPC时,应用可能会崩溃,因为不同DLL中的静态gRPC代码副本无法正常协作。
现状与建议
- 现状:目前,gRPC在Windows DLL构建方面存在明显的局限性,官方不推荐使用DLL构建,并且存在多个已知问题。
- 建议:对于需要在Windows上使用gRPC的开发者,建议优先考虑静态链接的方式。如果确实需要使用DLL,建议密切关注gRPC社区的动态,参与讨论并尝试现有的解决方案。
参考链接
- : gRPC官方文档
- Stack Overflow讨论
- gRPC GitHub Issue
- gRPC GitHub Issue
- gRPC GitHub Issue