bazel - 如何使用 Bazel 包含已构建的静态库(.a 文件)?
问题描述
我正在尝试使用 Bazel 包含一个小型静态库,但无论我尝试过哪种方法,我似乎都遇到了错误。
静态库是我自己搭建的,非常简单。在另一个 .cc 文件中,我只是调用了这个库中的三个函数。虽然我能够使用 Makefile 构建可执行文件,但我无法使用 bazel 获得相同的输出。
我的构建文件:
cc_library(
name="mylib",
srcs = ["lib/mylib.a"],
)
cc_binary(
name="main",
srcs = ["main.cc", "include/add.h", "include/answer.h", "lib/mylib.a"],
copts = [
"-Iinclude/",
"-Llib/",
],
linkstatic=1,
)
cc_binary(
name = "run_main",
srcs = ["lib/mylib.a"],
copts = [
"-I.",
"-Llib/",
],
deps = [":main_lib", ":mylib"],
)
cc_library(
name = "main_lib",
srcs = ["main.cc"],
hdrs = ["include/add.h",
"include/answer.h"
],
copts = [
"-Iinclude/",
],
linkstatic=1,
)
两个 cc_binary 目标都失败,如下所示:
[andrei@dell static_test_bazel]$ bazel build --subcommands --sandbox_debug --verbose_failures //:main
Extracting Bazel installation...
Starting local Bazel server and connecting to it...
INFO: Analysed target //:main (7 packages loaded).
INFO: Found 1 target...
SUBCOMMAND: # //:main [action 'Compiling main.cc']
(cd /home/andrei/.cache/bazel/_bazel_andrei/870f0aacf9816a8089f2d66bef6251e2/execroot/__main__ && \
exec env - \
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin:/opt/android-sdk/platform-tools \
PWD=/proc/self/cwd \
/usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -B/usr/bin -B/usr/bin -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer '-std=c++0x' -MD -MF bazel-out/k8-fastbuild/bin/_objs/main/main.pic.d '-frandom-seed=bazel-out/k8-fastbuild/bin/_objs/main/main.pic.o' -fPIC -iquote . -iquote bazel-out/k8-fastbuild/genfiles -iquote bazel-out/k8-fastbuild/bin -iquote external/bazel_tools -iquote bazel-out/k8-fastbuild/genfiles/external/bazel_tools -iquote bazel-out/k8-fastbuild/bin/external/bazel_tools -Iinclude/ -Llib/ -fno-canonical-system-headers -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -c main.cc -o bazel-out/k8-fastbuild/bin/_objs/main/main.pic.o)
SUBCOMMAND: # //:main [action 'Linking main']
(cd /home/andrei/.cache/bazel/_bazel_andrei/870f0aacf9816a8089f2d66bef6251e2/execroot/__main__ && \
exec env - \
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin:/opt/android-sdk/platform-tools \
PWD=/proc/self/cwd \
/usr/bin/gcc -o bazel-out/k8-fastbuild/bin/main '-fuse-ld=gold' -Wl,-no-as-needed -Wl,-z,relro,-z,now -B/usr/bin -B/usr/bin -pass-exit-codes -Wl,-S -Wl,@bazel-out/k8-fastbuild/bin/main-2.params)
ERROR: /home/andrei/embedded-nn/static_test_bazel/BUILD:8:1: Linking of rule '//:main' failed (Exit 1): process-wrapper failed: error executing command
(cd /home/andrei/.cache/bazel/_bazel_andrei/870f0aacf9816a8089f2d66bef6251e2/execroot/__main__ && \
exec env - \
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin:/opt/android-sdk/platform-tools \
PWD=/proc/self/cwd \
TMPDIR=/tmp \
/home/andrei/.cache/bazel/_bazel_andrei/870f0aacf9816a8089f2d66bef6251e2/execroot/__main__/_bin/process-wrapper '--timeout=0' '--kill_delay=15' /usr/bin/gcc -o bazel-out/k8-fastbuild/bin/main '-fuse-ld=gold' -Wl,-no-as-needed -Wl,-z,relro,-z,now -B/usr/bin -B/usr/bin -pass-exit-codes -Wl,-S -Wl,@bazel-out/k8-fastbuild/bin/main-2.params)
bazel-out/k8-fastbuild/bin/_objs/main/main.pic.o:main.cc:function main: error: undefined reference to 'setSummand(int)'
bazel-out/k8-fastbuild/bin/_objs/main/main.pic.o:main.cc:function main: error: undefined reference to 'add(int)'
bazel-out/k8-fastbuild/bin/_objs/main/main.pic.o:main.cc:function main: error: undefined reference to 'answer()'
collect2: error: ld returned 1 exit status
Target //:main failed to build
INFO: Elapsed time: 3.026s, Critical Path: 0.08s
INFO: 1 process: 1 processwrapper-sandbox.
FAILED: Build did NOT complete successfully
项目结构:
WORKSPACE
BUILD
main.cc
lib/
--- mylib.a
include/
--- add.h
--- answer.h
我关注了Bazel 中的讨论,未能包含外部静态库 .a,但我不确定我是否面临同样的问题。
解决方案
你可以试试这个:
cc_library(
name = "mylib",
srcs = ["lib/mylib.a"],
hdrs = ["mylib.h"]
)
cc_binary(
name = "main",
srcs = ["main.cc"],
hrds = ["include/add.h", "include/answer.h"]
deps = [":mylib"]
copts = [
"-Iinclude/",
"-Llib/",
],
linkstatic=1,
)
注意:您必须在规则中指定头文件,mylib
以便它们可以包含在main.cc
推荐阅读
- node.js - (electron.js) npm start 什么都不做
- r - For 循环只计算第一行
- python - Django - 当前路径与任何 url 模式都不匹配
- android - 在 RxJava 中合并两个具有独立和相等超时的流的正确方法
- django - Django import export - 如何跳过新行,只更新现有行
- javascript - D3.js 加载资源失败:服务器响应状态为 404(未找到)
- php - 隐藏在 laravel 7
- html - Bootstrap 布局可滚动 div
- javascript - 无法在使用 ref 和 VeeValidate 的方法中获得实际的“有效”属性
- javascript - D3.js V5 - 为什么我的条形图轴没有缩放?