不要用 Bazel 混淆共享库的名称
Do not mangle name of shared library with Bazel
给定一个使用 Bazel 构建的 C++ 应用程序,该应用程序依赖于系统提供的外部共享库:
cc_binary(
name = 'app',
srcs = ['app.cpp'],
linkstatic = False,
deps = ['@my_system//:system_lib'],
)
WORKSPACE 和 BUILD.my_system 文件:
new_local_repository(
name = 'my_system',
build_file = 'BUILD.my_system',
path = '/usr/lib/my_system/',
)
cc_import(
name = 'system_lib',
shared_library = 'system_lib.so',
visibility = ['//visibility:public'],
)
这将构建,但首先将系统提供的库复制到缓存,并链接到该库:
$ ldd bazel-bin/app/app
system_lib.so => /home/erenon/bazel/proj/bazel-bin/app/../_solib_k8/_U@my_system_S_S_Csystem_Ulib___Uexternal_Smy_system/system_lib.so
[...]
如果我将 app
移动到具有 /usr/lib/my_system/system_lib.so
的相同系统,它会中断,因为它错过了缓存。我想以直接链接到原始 .so
的方式打包 app
,没有中间缓存副本或名称修改,即:我想实现:
$ ldd bazel-bin/app/app
system_lib.so => /usr/lib/my_system/system_lib.so
[...]
我试过 cc_import.system_provided
,但似乎只适用于 Windows lib/dll
s。
用另一个 cc_library 包装你的图书馆。
我无法解释为什么它有效,但它确实有效。
cc_library(
name = "libsystem_lib",
srcs = [ ":system_lib" ],
hdrs = ...
)
就靠这个了
给定一个使用 Bazel 构建的 C++ 应用程序,该应用程序依赖于系统提供的外部共享库:
cc_binary(
name = 'app',
srcs = ['app.cpp'],
linkstatic = False,
deps = ['@my_system//:system_lib'],
)
WORKSPACE 和 BUILD.my_system 文件:
new_local_repository(
name = 'my_system',
build_file = 'BUILD.my_system',
path = '/usr/lib/my_system/',
)
cc_import(
name = 'system_lib',
shared_library = 'system_lib.so',
visibility = ['//visibility:public'],
)
这将构建,但首先将系统提供的库复制到缓存,并链接到该库:
$ ldd bazel-bin/app/app
system_lib.so => /home/erenon/bazel/proj/bazel-bin/app/../_solib_k8/_U@my_system_S_S_Csystem_Ulib___Uexternal_Smy_system/system_lib.so
[...]
如果我将 app
移动到具有 /usr/lib/my_system/system_lib.so
的相同系统,它会中断,因为它错过了缓存。我想以直接链接到原始 .so
的方式打包 app
,没有中间缓存副本或名称修改,即:我想实现:
$ ldd bazel-bin/app/app
system_lib.so => /usr/lib/my_system/system_lib.so
[...]
我试过 cc_import.system_provided
,但似乎只适用于 Windows lib/dll
s。
用另一个 cc_library 包装你的图书馆。
我无法解释为什么它有效,但它确实有效。
cc_library(
name = "libsystem_lib",
srcs = [ ":system_lib" ],
hdrs = ...
)
就靠这个了