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
Извините за длинный вопрос 🙁
Bazel выполняет действие (в вашем случае действие компиляции C ++) в песочнице, чтобы обеспечить герметичность. Это необходимо, чтобы быть корректным при изменении входных данных действия. Поэтому вы должны рассказать Bazel о все входы, в том числе системные.
Но, конечно, вы можете зависеть от системных библиотек, взгляните на правило local_repository. Вы также можете найти это пример в bazel-обсуждения @ нить полезная.
@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__"],
)