Библиотеки Bazel Link .so, расположенные в совершенно другой, очень удаленной папке

Folks,

Я пытаюсь связать .h и статические библиотеки в мою программу tenorflow. Мои заголовки находятся в

/usr/local/include/lcm

И статические / общие библиотеки (.so и т. Д.) В

/usr/local/lib

Но Базель жалуется, что их не существует или что он не может их найти. Вот мой код в моем файле BUILD:

package(default_visibility = ["//tensorflow:internal"])
licenses(["notice"])  # Apache 2.0
exports_files(["LICENSE"])

# LCM shared libraries path
cc_library(
name = "lcm_lib",
srcs = glob([
"*.so",
]),
copts = ["-L/usr/local/lib"],
linkopts = ["-pthread", "-shared"],
visibility = ["//visibility:public"],
)

# LCM header libraries path
cc_library(
name = "lcm_headers",
hdrs = glob([
"include/**/*.h",
]),
copts = ["-L/usr/local/include"],
linkopts = ["-pthread"],
visibility = ["//visibility:public"],
)

cc_binary(
name = "myProject",
srcs = [
"main.cc",
],
linkopts = ["-lm"],
deps = [
"//tensorflow/cc:cc_ops",
"//tensorflow/core:framework_internal",
"//tensorflow/core:tensorflow",
],
)

filegroup(
name = "all_files",
srcs = glob(
["**/*"],
exclude = [
"**/METADATA",
"**/OWNERS",
"bin/**",
"gen/**",
],
),
visibility = ["//tensorflow:__subpackages__"],
)

Если я удаляю связанный с LCM код (как из BUILD, так и из main.cc), то моя программа собирается и запускается. Когда я включаю LCM, то получаю сообщение об ошибке, в котором говорится, что lcm :: LCM :: ~ LCM () не определена и что он не может найти liblcm.so.
Теперь мой нетензорный код (или большая часть моего проекта) работает под управлением cmake, и можно найти LCM и остальные необходимые мне библиотеки (openCV и т. Д.). Я использую команды в моем CMakeList.txt как:

# search path for LCM header files
set(LCM_IncludeSearchPaths
/usr/include/
/usr/local/include/
/opt/local/include
)
# search path for LCM static/dynamic libraries
set(LCM_LibrarySearchPaths
/usr/lib/
/usr/local/lib/
/opt/local/lib/
)
find_path(LCM_INCLUDE_DIR
NAMES lcm/lcm.h
HINTS ${LCM_IncludeSearchPaths}
)
FIND_LIBRARY(LCM_LIBS
NAMES lcm
HINTS ${LCM_LibrarySearchPaths}
PATH_SUFFIXES lib
)

И все это работает. Но это не работает для tenorflow и Bazel

Извините за длинный вопрос 🙁

1

Решение

Bazel выполняет действие (в вашем случае действие компиляции C ++) в песочнице, чтобы обеспечить герметичность. Это необходимо, чтобы быть корректным при изменении входных данных действия. Поэтому вы должны рассказать Bazel о все входы, в том числе системные.

Но, конечно, вы можете зависеть от системных библиотек, взгляните на правило local_repository. Вы также можете найти это пример в bazel-обсуждения @ нить полезная.

1

Другие решения

@mhlopko вот мои файлы сборки и файлы WORKSPACE, расположенные в одном каталоге:

Это мой тронутый файл WORKSPACE:

# LCM static libraries
new_local_repository(
name = "lcm_libs",
# pkg-config --variable=libdir x11
path = "/usr/local/lib",
build_file_content = """cc_library(
name = "liblcm",
srcs = ["liblcm.so"],
visibility = ["//visibility:public"],
)
""",
)

# LCM header files
new_local_repository(
name = "lcm_headers",
# pkg-config --variable=libdir x11
path = "/usr/local/include",
build_file_content = """cc_library(
name = "lcm",
hdrs = glob([
"lcm/*.h", "lcm/*.hpp",
]),
visibility = ["//visibility:public"],
)
""",
)

# bind to a name to avoid using the "actual" format
#bind(
#    name = "liblcm",
#    actual = "@lcm_libs//:liblcm",
#)
#bind(
#    name = "lcm",
#    actual = "@lcm_headers//:lcm",
#)
#

И мой СТРОЙ:

# Description:
#   Tensorflow C++ inference example for labeling images.

package(default_visibility = ["//tensorflow:internal"])
licenses(["notice"])  # Apache 2.0
exports_files(["LICENSE"])

cc_binary(
name = "facialFatigue",
srcs = [
"main.cc",
],
linkopts = ["-lm"],
deps = [
"//tensorflow/cc:cc_ops",
"//tensorflow/core:framework_internal",
"//tensorflow/core:tensorflow",
"@lcm_libs//:liblcm",
"@lcm_headers//:lcm",
],
)

filegroup(
name = "all_files",
srcs = glob(
["**/*"],
exclude = [
"**/METADATA",
"**/OWNERS",
"bin/**",
"gen/**",
],
),
visibility = ["//tensorflow:__subpackages__"],
)
0

По вопросам рекламы [email protected]