前面的例子都是在同一个repository里面折腾,现在是时候出去透透气了。外面已经有了那么多优秀的开源项目,千万不要重复造轮子,再说咱也造不过来呀。 将外部项目作为依赖引入是必需的。这些项目有些是Bazel项目,里面有WORKSPACE,有BUILD,定义了若干targets。但也有些并不是Bazel项目。对于前者,按照这些项目的存放地点不同,分为localrepository,gitrepository,httparchive。对于后者,指定它们只需要加一个new的前缀,即newlocalrepository,newgitrepository,newhttparchive。 我们先介绍第一个,localrepository,即本地文件系统中的Bazel项目。 这回我们需要创建两个repository,helloworldlib实现功能函数,helloworldmain调用函数。 helloworldlib目录结构如下 为了不让目录太过琐碎,我直接在repository的根目录放置了一个BUILD,使其成为一个package。BUILD内容如下load(rulescccc:defs。bzl,cclibrary)cclibrary(namehelloworldlib,srcs〔srchelloworld。cc〕,hdrs〔includehelloworld。h〕,visibility〔visibility:public〕,) includehelloworld。hpragmaonceincludestringstd::stringhelloworld(); srchelloworld。ccincludeincludehelloworld。hstd::stringhelloworld(){returnHello,world!;} 下面开始做第二个repository,helloworldmain,这次有点新东西,那个一直为空的WORKSPACE这回要派上用场了。它的主要用途就是将项目中用到的外部依赖引入进来,提供给相应的targets使用。 WORKSPACE内容如下localrepository(namehelloworldlib,path。。helloworldlib,) localrepository告诉Bazel我要引入一个外部Bazel项目,我给它起个名字叫helloworldlib,它位于本机文件系统,在上层目录的helloworldlib目录中(也可以使用pathtoreponame这样的绝对路径)。 srcBUILDload(rulescccc:defs。bzl,ccbinary)ccbinary(namehelloworldmain,srcs〔helloworldmain。cc〕,deps〔helloworldlib:helloworldlib,〕,) 这回deps中的label使用了完整的形式,之前是repository名,后面是target路径。由于我们之前把package直接定义在了根目录,所以这里没有package目录名。 srchelloworldmain。ccincludeincludehelloworld。hincludeiostreamintmain(){std::couthelloworld()std::endl;return0;} 注意include的路径,是从repository的根目录开始的。 编译运行,成功! 源码获取:gitgithub。com:zhouxindongbazellearning。git