Каков наилучший способ создания кода на C++, который использует библиотеку OpenCV с помощью Bazel? Я., как выглядят правила СТРОЙ?Создание кода OpenCV с использованием Bazel
Bazel.io имеет docs for external dependencies, но это не очень понятно.
Каков наилучший способ создания кода на C++, который использует библиотеку OpenCV с помощью Bazel? Я., как выглядят правила СТРОЙ?Создание кода OpenCV с использованием Bazel
Bazel.io имеет docs for external dependencies, но это не очень понятно.
Есть несколько вариантов. Самый простой способ, вероятно, установить локально в том, как сайт OpenCV рекомендует:
git clone https://github.com/Itseez/opencv.git
cd opencv/
mkdir build install
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/path/to/opencv/install ..
make install
Затем добавьте следующую строку в файл WORKSPACE:
new_local_repository(
name = "opencv",
path = "/path/to/opencv/install",
build_file = "opencv.BUILD",
)
Создать opencv.BUILD
в том же каталоге, что и рабочее пространство со следующими :
cc_library(
name = "opencv",
srcs = glob(["lib/*.so*"]),
hdrs = glob(["include/**/*.hpp"]),
includes = ["include"],
visibility = ["//visibility:public"],
linkstatic = 1,
)
Тогда ваш код может зависеть от @opencv//:opencv
связать в .so лет под Lib/и ссылки на заголовки под включать /.
Однако это не очень портативно. Если вы хотите портативное решение (и вы чувствуете амбициозность), вы можете добавить OpenCV git repo в свою рабочую область и загрузить &. Что-то вроде:
# WORKSPACE
new_git_repository(
name = "opencv",
remote = "https://github.com/Itseez/opencv.git",
build_file = "opencv.BUILD",
tag = "3.1.0",
)
И сделать opencv.BUILD что-то вроде:
cc_library(
name = "core",
visibility = ["//visibility:public"],
srcs = glob(["modules/core/src/**/*.cpp"]),
hdrs = glob([
"modules/core/src/**/*.hpp",
"modules/core/include/**/*.hpp"]
) + [":module-includes"],
)
genrule(
name = "module-includes",
cmd = "echo '#define HAVE_OPENCV_CORE' > [email protected]",
outs = ["opencv2/opencv_modules.hpp"],
)
...
Тогда ваш код может зависеть от более конкретных задач, например, @opencv//:core
.
В качестве третьего варианта вы указываете как cmake, так и OpenCV в файле WORKSPACE и используете genrule для запуска cmake на OpenCV из Bazel.
Успешное использование первой опции @ kristina.
Установка OpenCV:
git clone https://github.com/Itseez/opencv.git
cd opencv/
mkdir build install
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make install
Изменить WORKSPACE файл (в tensorflow/WORKSPACE клонированного из GitHub) файла opencv.BUILD
new_local_repository(
name = "opencv",
path = "/usr/local",
build_file = "opencv.BUILD",
)
Делают в том же месте, WORKSPACE файл :
cc_library(
name = "opencv",
srcs = glob(["lib/*.so*"]),
hdrs = glob(["include/**/*.hpp"]),
includes = ["include"],
visibility = ["//visibility:public"],
linkstatic = 1,
)
Вы, возможно, придется конфиг путь OpenCV ЛИЭС:
а. Убедитесь, что вы /etc/ld.so.conf.d/opencv.conf файл с содержанием:
/usr/local/lib
б. Выполните команду:
sudo ldconfig -v
Как включить int мой файл BUILD? – Pototo
Обязательно получите файлы .h. Не уверен, как это сработало для других. Это то, что моя сборка выглядела как: пакет (default_visibility = [ "// видимости: общественность"]) cc_library ( имя = "OpenCV", SRCS = Глоб ([ "Lib/* так *"]), ДРЧА = Глоб ([ "включает в себя/opencv2/**/*. ч", "включают в себя/opencv2/**/*. HPP", ]), strip_include_prefix = "включает в себя", linkstatic = 1, видимость = ["// видимость: общедоступная"], ) – tdeegan
Это то, что я сделал только для OpenCV 2.4.13.2, core/
. Этот подход исходит из источника opencv, который адаптирован из принятого ответа выше @kristina.
Первая вещь, чтобы добавить http_archive для выпуска OpenCV 2.4:
# OpenCV 2.4.13.2
new_http_archive(
name = "opencv2",
url = "https://github.com/opencv/opencv/archive/2.4.13.2.zip",
build_file = "third_party/opencv2.BUILD",
strip_prefix = "opencv-2.4.13.2",
)
А затем добавьте файл third_party/opencv2.BUILD
как:
cc_library(
name = "dynamicuda",
hdrs = glob([
"modules/dynamicuda/include/**/*.hpp",
]),
includes = [
"modules/dynamicuda/include"
],
)
cc_library(
name = "core",
visibility = ["//visibility:public"],
srcs = glob(["modules/core/src/**/*.cpp"]),
hdrs = glob([
"modules/core/src/**/*.hpp",
"modules/core/include/**/*.hpp",
]) + [
":module_includes",
":cvconfig",
":version_string",
],
copts = [
"-Imodules/dynamicuda/include",
],
# Note that opencv core requires zlib and pthread to build.
linkopts = ["-pthread", "-lz"],
includes = [
"modules/core/include",
],
deps = [
":dynamicuda",
],
)
genrule(
name = "module_includes",
cmd = "echo '#define HAVE_OPENCV_CORE' > [email protected]",
outs = ["opencv2/opencv_modules.hpp"],
)
genrule(
name = "cvconfig",
outs = ["cvconfig.h"],
cmd = """
cat > [email protected] <<"EOF"
// JPEG-2000
#define HAVE_JASPER
// IJG JPEG
#define HAVE_JPEG
// PNG
#define HAVE_PNG
// TIFF
#define HAVE_TIFF
// Compile for 'real' NVIDIA GPU architectures
#define CUDA_ARCH_BIN ""
// NVIDIA GPU features are used
#define CUDA_ARCH_FEATURES ""
// Compile for 'virtual' NVIDIA PTX architectures
#define CUDA_ARCH_PTX ""
EOF"""
)
genrule(
name = "version_string",
outs = ["version_string.inc"],
cmd = """
cat > [email protected] <<"EOF"
"\\n"
)
Обратите внимание, что я ничего не поставил в version_string.inc
. Это просто строковый литерал C++, который не влияет на функциональность OpenCV. Если вы действительно заинтересованы в этом файле, см. Это example.
После этого вы можете добавить цель с зависимостями от @opencv2//:core
.
Большое спасибо! Я пошел с самым простым вариантом (первым). Некоторые незначительные исправления, если кто-то использует OpenCV 3.1.0: cc_library ( name = "opencv", srcs = glob (["lib/*. So *"]), hdrs = glob (["include/**/* .hpp "]), включает в себя = [" включить "], visibility = [" // visibility: public "], linkstatic = 1, ) –
Спасибо, я обновил код в первом примере. – kristina
@kristina второе решение не переносится ни одним. существует много отсутствующих файлов, которые генерируются при запуске cmake, а не только 'opencv_modules.hpp' –