bazel cc_binary() 创建没有任何符号的 .so 文件?
bazel cc_binary() creates .so file without any symbols?
这是 ubuntu 16.04
中的边框 2.2.0
运行。我已经为 "build" 一个 C++ 库实现了一个宏,并生成了 .a
和 .so
文件。
def add_cc_lib(lib, SRCS, HDRS, lib_defines, lib_includes, lib_copts, lib_linkopts, archive_libs_deps, additional_deps):
# Define target to create .a for this library
native.cc_library(
name = lib,
srcs = SRCS,
hdrs = HDRS,
deps = archive_libs_deps + additional_deps,
defines = lib_defines,
includes = lib_includes,
copts = lib_copts,
linkopts = lib_linkopts,
linkstatic = 1,
visibility = ["//visibility:public"]
)
# Define target to also create .so for this library
native.cc_binary(
name = "lib" + lib + ".so",
srcs = [":" + lib] + archive_libs_deps,
deps = additional_deps,
defines = lib_defines,
includes = lib_includes,
copts = lib_copts,
linkopts = lib_linkopts,
linkshared = 1,
linkstatic = 1,
visibility = ["//visibility:public"],
)
其中 archive_libs_deps
和 additional_deps
是当此 add_cc_lib()
宏用于在我的存储库中添加 C++ 库时提供的目标列表。
问题是,虽然这会产生 libfoo.so
,但它没有来自 foo.a
:
的任何符号
# nm bazel-bin/<path>/libfoo.so
0000000000002008 A __bss_start
0000000000002008 b completed.7594
w __cxa_finalize
0000000000000630 t deregister_tm_clones
00000000000006c0 t __do_global_dtors_aux
0000000000001d40 t __do_global_dtors_aux_fini_array_entry
0000000000002000 d __dso_handle
0000000000001d50 d _DYNAMIC
0000000000002008 A _edata
0000000000002009 A _end
0000000000000730 T _fini
0000000000000700 t frame_dummy
0000000000001d48 t __frame_dummy_init_array_entry
0000000000000780 r __FRAME_END__
0000000000001fd8 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000000005e0 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000001d38 d __JCR_END__
0000000000001d38 d __JCR_LIST__
w _Jv_RegisterClasses
0000000000000670 t register_tm_clones
0000000000002008 d __TMC_END__
0000000000002008 d __TMC_LIST__
我在 Internet 上进行了大量搜索,并尝试了一些没有成功的方法。我在这里错过了什么吗?非常感谢任何帮助。
在 cc_library
目标中传递 alwayslink = True
。
这是 ubuntu 16.04
中的边框 2.2.0
运行。我已经为 "build" 一个 C++ 库实现了一个宏,并生成了 .a
和 .so
文件。
def add_cc_lib(lib, SRCS, HDRS, lib_defines, lib_includes, lib_copts, lib_linkopts, archive_libs_deps, additional_deps):
# Define target to create .a for this library
native.cc_library(
name = lib,
srcs = SRCS,
hdrs = HDRS,
deps = archive_libs_deps + additional_deps,
defines = lib_defines,
includes = lib_includes,
copts = lib_copts,
linkopts = lib_linkopts,
linkstatic = 1,
visibility = ["//visibility:public"]
)
# Define target to also create .so for this library
native.cc_binary(
name = "lib" + lib + ".so",
srcs = [":" + lib] + archive_libs_deps,
deps = additional_deps,
defines = lib_defines,
includes = lib_includes,
copts = lib_copts,
linkopts = lib_linkopts,
linkshared = 1,
linkstatic = 1,
visibility = ["//visibility:public"],
)
其中 archive_libs_deps
和 additional_deps
是当此 add_cc_lib()
宏用于在我的存储库中添加 C++ 库时提供的目标列表。
问题是,虽然这会产生 libfoo.so
,但它没有来自 foo.a
:
# nm bazel-bin/<path>/libfoo.so
0000000000002008 A __bss_start
0000000000002008 b completed.7594
w __cxa_finalize
0000000000000630 t deregister_tm_clones
00000000000006c0 t __do_global_dtors_aux
0000000000001d40 t __do_global_dtors_aux_fini_array_entry
0000000000002000 d __dso_handle
0000000000001d50 d _DYNAMIC
0000000000002008 A _edata
0000000000002009 A _end
0000000000000730 T _fini
0000000000000700 t frame_dummy
0000000000001d48 t __frame_dummy_init_array_entry
0000000000000780 r __FRAME_END__
0000000000001fd8 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000000005e0 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000001d38 d __JCR_END__
0000000000001d38 d __JCR_LIST__
w _Jv_RegisterClasses
0000000000000670 t register_tm_clones
0000000000002008 d __TMC_END__
0000000000002008 d __TMC_LIST__
我在 Internet 上进行了大量搜索,并尝试了一些没有成功的方法。我在这里错过了什么吗?非常感谢任何帮助。
在 cc_library
目标中传递 alwayslink = True
。