如何运行Bazel编译的C++二进制文件(无需bazel run及解决库依赖)
解决Bazel构建二进制文件运行时的共享库缺失问题
一、临时补全共享库路径(快速测试用)
- 先找到目标二进制依赖的所有共享库:可以用
bazel cquery --output=files //your:target命令列出所有关联的库文件,它们一般在bazel-bin下的对应子目录里。 - 在运行二进制前,把共享库所在目录加入系统库搜索路径:
# Linux系统 export LD_LIBRARY_PATH=/path/to/your/libs:$LD_LIBRARY_PATH ./binary_name # macOS系统 export DYLD_LIBRARY_PATH=/path/to/your/libs:$DYLD_LIBRARY_PATH ./binary_name - 如果要复制到其他机器,记得把二进制文件和所有依赖的共享库一起打包过去,在目标机器上执行同样的环境变量设置即可。
二、构建独立可执行文件(推荐长期方案)
直接让Bazel生成不依赖外部共享库的二进制,省得折腾路径:
- 针对C/C++项目,修改
BUILD文件里的cc_binary规则,加上linkstatic = True:cc_binary( name = "binary_name", srcs = ["main.cc"], linkstatic = True, # 强制静态链接依赖库 deps = [...], ) - 如果不想改BUILD文件,也可以用构建参数强制静态链接:
# 全静态链接(部分系统库可能不支持,比如glibc) bazel build --linkopt=-static //your:target # 仅静态链接标准库(更稳妥) bazel build --linkopt=-static-libgcc --linkopt=-static-libstdc++ //your:target - Go等语言的Bazel构建默认就是静态编译,直接
bazel build出来的二进制就能直接拷贝运行。
三、携带runfiles目录运行
Bazel构建后,二进制文件旁边会有一个同名的.runfiles目录,里面包含了所有依赖的库和资源文件。把二进制和这个目录一起复制到目标位置,直接运行二进制即可——Bazel会自动从.runfiles里加载所需依赖,不用手动设置路径。
内容的提问来源于stack exchange,提问作者SP5RFD
相关产品推荐
相关产品推荐

