2016-01-25 4 views
9

का उपयोग कर ओपनसीवी कोड बिल्डिंग सी ++ कोड बनाने का सबसे अच्छा तरीका क्या है जो बैज़ेल का उपयोग कर ओपनसीवी लाइब्रेरी का उपयोग करता है? यानी, बिल्ड नियम क्या दिखेंगे?बेज़ेल

Bazel.io में docs for external dependencies है लेकिन यह बहुत स्पष्ट नहीं है।

उत्तर

16

कुछ विकल्प हैं।

new_local_repository(
    name = "opencv", 
    path = "/path/to/opencv/install", 
    build_file = "opencv.BUILD", 
) 

निम्नलिखित के साथ कार्यक्षेत्र के रूप में एक ही निर्देशिका में opencv.BUILD बनाएँ:

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 

फिर अपने कार्यक्षेत्र फाइल करने के लिए निम्नलिखित जोड़ें: सबसे आसान तरीका है शायद रास्ता OpenCV साइट की सिफारिश की स्थानीय स्तर पर स्थापित करने के लिए है :

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

फिर अपने कोड/शामिल तहत .so के दशक में लिंक करने के लिए lib के तहत/और हेडर संदर्भ @opencv//:opencv पर निर्भर कर सकते हैं।

हालांकि, यह बहुत पोर्टेबल नहीं है। यदि आप एक पोर्टेबल समाधान चाहते हैं (और आप महत्वाकांक्षी महसूस कर रहे हैं), तो आप अपने वर्कस्पेस में ओपनसीवी गिट रेपो जोड़ सकते हैं और इसे & डाउनलोड कर सकते हैं। कुछ की तरह:

# 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

एक तीसरे विकल्प के रूप में, आप अपनी वर्कस्पेस फ़ाइल में सेमेक और ओपनसीवी दोनों घोषित करते हैं और बैज़ेल के भीतर ओपनसीवी पर सेमेक चलाने के लिए एक उत्पत्ति का उपयोग करते हैं।

+1

बहुत बहुत धन्यवाद! मैं सबसे आसान विकल्प (पहला वाला) के साथ चला गया। अगर कोई ओपनसीवी 3.1.0 का उपयोग कर रहा है तो कुछ मामूली सुधार: cc_library ( name = "opencv", srcs = glob (["lib/*। So *"]), hdrs = glob (["शामिल/**/* .एचपीपी "]), में = [" शामिल "], दृश्यता = [" // दृश्यता: सार्वजनिक "], लिंकस्टैटिक = 1, ) –

+0

धन्यवाद, मैंने पहले उदाहरण में कोड अपडेट किया है। – kristina

+0

@ क्रिस्टीना दूसरा समाधान पोर्टेबल नहीं है। cmake चलाते समय उत्पन्न होने वाली बहुत सारी गायब फ़ाइलें होती हैं, न केवल 'opencv_modules.hpp' –

2

मैं @ क्रिस्टीना के पहले विकल्प के साथ सफल हूं। कार्यस्थान फ़ाइल के रूप में एक ही स्थान पर

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 बदलें फ़ाइल

    new_local_repository(
    
    name = "opencv", 
    
    path = "/usr/local", 
    
    build_file = "opencv.BUILD", 
    
    ) 
    
  • मेक opencv.BUILD फ़ाइल (tensorflow/कार्यक्षेत्र GitHub से क्लोन पर):

    1. opencv स्थापित करें :

      cc_library(
      
      name = "opencv", 
      
      srcs = glob(["lib/*.so*"]), 
      
      hdrs = glob(["include/**/*.hpp"]), 
      
      includes = ["include"], 
      
      visibility = ["//visibility:public"], 
      
      linkstatic = 1, 
      
      ) 
      
    2. ,210
    3. आप opencv libs पथ विन्यास के लिए हो सकता है:

    एक। सुनिश्चित करें कि आप सामग्री के साथ फ़ाइल /etc/ld.so.conf.d/opencv.conf है बनाओ:

    /usr/local/lib 
    

    ज। कमांड चलाएँ:

    sudo ldconfig -v 
    
  • +0

    मैं अपनी बिल्ड फ़ाइल को कैसे शामिल करूं? – Pototo

    +0

    .h फ़ाइलों को भी प्राप्त करना सुनिश्चित करें। यह सुनिश्चित नहीं है कि यह दूसरों के लिए कैसे काम करता है। पैकेज (default_visibility = [ "// दृश्यता: सार्वजनिक"]) यह वही अपने निर्माण की तरह दिखाई देता है cc_library ( नाम = "opencv", srcs = ग्लोब ([ "। Lib/* तो *"]), HDRs = ग्लोब ([ "/ opencv2/**/*। ज में शामिल हैं", , "/ opencv2/**/*। HPP शामिल हैं" ]), strip_include_prefix = "शामिल हैं", linkstatic = 1, दृश्यता = ["// दृश्यता: सार्वजनिक"], ) – tdeegan

    1

    यह है कि मैं क्या OpenCV 2.4.13.2, core/ के लिए ही किया है। यह दृष्टिकोण ओपनसीवी स्रोत से जाता है, जिसे उपरोक्त स्वीकृत उत्तर से @ क्रिस्टीना द्वारा अनुकूलित किया जाता है।

    # 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" 
    ) 
    

    ध्यान दें कि मैं में कुछ भी नहीं लगाया

    पहली बात opencv 2.4 रिहाई के लिए http_archive जोड़ने के लिए है version_string.inc। यह सिर्फ एक सी ++ स्ट्रिंग अक्षर है जो ओपनसीवी की कार्यक्षमता को प्रभावित नहीं करता है। यदि आप वास्तव में इस फ़ाइल में रूचि रखते हैं तो यह example देखें।

    इसके बाद आप @opencv2//:core पर निर्भरताओं के साथ लक्ष्य जोड़ने में सक्षम होना चाहिए।