如何判断RPC调用是否需要依赖tirpc库?
判断是否需要链接libtirpc的方法
一、基于系统特性的简单规则
可以通过以下两点快速判断:
- glibc版本分界:glibc 2.24及以上版本已移除内置的RPC(SunRPC)实现,这类系统必须依赖
libtirpc;glibc 2.23及以下版本的RPC接口内置在libc中,无需额外链接库。- 可通过
ldd --version查看系统glibc版本,或查看/usr/lib/libc.so.6的版本信息。
- 可通过
- 头文件位置与依赖宏:
- 如果RPC头文件(如
rpc/rpc.h)直接在/usr/include/下,且无需定义特殊宏即可正常包含使用,无需链接libtirpc; - 如果头文件位于
/usr/include/tirpc/目录下,或包含rpc/rpc.h时需要预先定义TIRPC宏,说明系统使用libtirpc实现,必须链接该库。
- 如果RPC头文件(如
二、通过编译检测(try_compile)的可靠方法
若规则判断存在模糊性,用CMake的try_compile()编译最小RPC程序是最可靠的方式。
最小测试程序代码(rpc_test.c)
#include <rpc/rpc.h> int main(void) { // 引用核心RPC全局变量,触发符号检查 struct rpc_createerr *err = &rpc_createerr; (void)err; return 0; }
CMake中的检测示例
# 尝试不链接libtirpc编译测试程序 try_compile( RPC_WITHOUT_TIRPC ${CMAKE_BINARY_DIR}/rpc_test ${CMAKE_CURRENT_SOURCE_DIR}/rpc_test.c OUTPUT_VARIABLE RPC_COMPILE_OUTPUT ) if(RPC_WITHOUT_TIRPC) message(STATUS "RPC接口内置在libc中,无需链接libtirpc") else() message(STATUS "需要链接libtirpc,尝试链接该库") # 尝试链接libtirpc再次检测 try_compile( RPC_WITH_TIRPC ${CMAKE_BINARY_DIR}/rpc_test_tirpc ${CMAKE_CURRENT_SOURCE_DIR}/rpc_test.c LINK_LIBRARIES tirpc OUTPUT_VARIABLE RPC_TIRPC_COMPILE_OUTPUT ) if(RPC_WITH_TIRPC) message(STATUS "链接libtirpc成功") set(NEED_TIRPC ON) else() message(FATAL_ERROR "无法编译RPC程序,可能缺少libtirpc开发包") endif() endif()
这个测试程序仅依赖核心RPC头文件并引用常见RPC全局变量,能准确检测系统是否需要链接libtirpc。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

