16

Bazel を使用して OpenCV ライブラリを使用する C++ コードをビルドする最良の方法は何ですか? つまり、BUILD ルールはどのようになりますか?

bazel を使用して次のコードをコンパイルするには、WORKSPACEおよびファイルはどのように見える必要がありますか。BUILD


#include "opencv2/opencv.hpp"
#include "iostream"

int main(int, char**) {
  using namespace cv;
  VideoCapture cap(0);
  Mat save_img; cap >> save_img;
  if(save_img.empty())
  {
    std::cerr << "ERROR >> Something is wrong with camera..." << std::endl;
  }
  imwrite("test.jpg", save_img);
  return 0;
}

4

5 に答える 5

31

いくつかのオプションがあります。最も簡単な方法は、おそらく 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以下を使用して、WORKSPACE と同じディレクトリに作成します。

cc_library(
    name = "opencv",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob(["include/**/*.hpp"]),
    includes = ["include"],
    visibility = ["//visibility:public"], 
    linkstatic = 1,
)

@opencv//:opencv次に、コードはlib/ の下の .so にリンクし、include/ の下のヘッダーを参照することに依存できます。

ただし、これはあまり移植性がありません。移植可能なソリューションが必要な場合 (そして野心的である場合)、OpenCV git リポジトリをワークスペースに追加し、ダウンロードしてビルドすることができます。何かのようなもの:

# 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' > $@",
    outs = ["opencv2/opencv_modules.hpp"],
)

...

次に、コードはより具体的なターゲットに依存する可能性があります@opencv//:core

3 番目のオプションとして、WORKSPACE ファイルで cmake と OpenCV の両方を宣言し、genrule を使用して Bazel 内から OpenCV で cmake を実行します。

于 2016-01-26T21:10:28.777 に答える