bazel生成C++动态链接库so文件

bazel是Google开源的一款编译工具,具有支持多种语言,编译速度快,处理依赖方便,编写编译规则简单的优点。

有人说,bazel是流氓工具,为什么呢?因为它不仅QJ你们组,还QJ你的兄弟组。意思是说一个组用了bazel,其他组为了协同工作,也必须用bazel,否则作为一个项目整体没法管理。

这在一定程度上是对的,因为一个项目想打包成一个整体,如果其中一部分使用bazel编译,另外一部分写makefile编译,那么这两个部分没法生成一个完整的动态链接库给外界使用。

退而求其次,能不能接受一个项目提供多个动态链接库打包呢?如果能接受,那么在项目一部分使用bazel编译,另一部分写makefile编译的情况下,也是可以管理的。因为使用bazel可以生成动态链接库so文件,makefile也可以,把两个放一起,问题就解决了。

这篇文章简单介绍使用bazel生成C++动态链接库文件的方法。

需要的前提知识有:
1. 熟悉gcc的编译和链接命令;
2. 熟悉bazel的使用方法,知道WORKSPACE和BUILD文件的作用;
3. 熟悉bazel的规则,比如cc_binary,cc_import,可以参考https://docs.bazel.build/versions/master/be/c-cpp.html

使用bazel生成动态链接库文件其实很简单,使用cc_binary规则就可以了,如果你仔细阅读bazel的C++规则文件,你会知道只要加入这样的规则:

cc_binary(
name = "libmylib.so", #mylib是头文件的名字
srcs = ["mylib.cpp",
    "mylib.h", #头文件和源文件,必须都有
],
deps = ["//XX:XX", #依赖,注意要把头文件和源文件中include的头文件所在的BUILD包都加进去
],
copts = ["-g"#编译时候的命令
],
linkopts = ["-lstdc++", #链接时候的命令
],
linkshared = True,
linkstatic = True,
)

写好上述规则后,在WORKSPACE目录运行bazel build //XX:libmylib.so即可得到这个项目的动态编译库文件。

查看动态编译库文件的链接文件。在libmylib.so目录下输入ldd libmylib.so,即可查看libmylib.so正常被调用需要在哪些位置找到哪些更底层的动态链接库文件,可以根据这个目录在新环境里安装相应的依赖,使libmylib.so可以正常工作。

你可能感兴趣的:(C++)