[bazel apollo] bazel CMake link Caffe Enet - e-guy/e-guyNotes GitHub Wiki

在apollo 中使用bazel 编译链接Caffe-Enet

0. introduction

建立bazel 编译项目(例如下面的程序main.cpp), 调用 caffe-enet 库 (在apollo@docker 中编译好caffe-enet, 确认.so 和头文件的位置. 假设 caffe-enet 位置为 /apollo/modules/qperception/src/lane_detector/scripts/ENet/caffe-enet, 自己的 package 项目 在 /apollo/modules/qperception/src/tailangle_calcu)

./tailangle_calcu/
./tailangle_calcu/src/caffe_enet_test.cpp
./tailangle_calcu/CMakeLists.txt # build with CMake
./tailangle_calcu/BUILD # build with bazel

使用 bazel

1. 在 indocker$ /apollo 目录下的WORKSPACE.in文件中添加:

# Caffe enet
new_local_repository(
    name = "caffe_enet",
    build_file = "third_party/caffe_enet.BUILD",
    path = "/apollo/modules/qperception/src/lane_detector/scripts/ENet/caffe-enet",
)

2. 在 indocker$ /apollo/third_party/ 目录下新建 caffe_enet.BUILD 文件:

licenses(["notice"])

package(default_visibility = ["//visibility:public"])

cc_library(
    name = "core",
    srcs = [
        "build/lib/libcaffe.so",
    ],
    includes = ["include",],
    linkopts = [
        "-Wl,-rpath,/apollo/modules/qperception/src/lane_detector/scripts/ENet/caffe-enet/build/lib",
        #"-lcaffe",
        "-Wl,-rpath,/usr/lib/x86_64-linux-gnu/",
        "-lopencv_core",
        "-lopencv_highgui",
        "-lopencv_imgproc",
    ],
)

3. 在自己的 bazel package 根目录中 添加 BUILD 文件:

load("//tools:cpplint.bzl", "cpplint")

package(default_visibility = ["//visibility:public"])

cc_binary(
    name = "caffe_enet_test",
    srcs = ["src/caffe_enet_test.cpp",],
    deps = ["@caffe_enet//:core",
             # "@opencv2//:core",      # or "-lopencv_core" in linkopts
    ],
    linkopts = ["-lboost_system", "-lglog", "-lopencv_imgproc", "-lopencv_core",],
)

4. 编译与执行

rr@in_dev_docker:/apollo$ bazel build //modules/qperception/src/tailangle_calcu:caffe_enet_test --verbose_failures

rr@in_dev_docker:/apollo/bazel-bin/modules/qperception/src/tailangle_calcu$ ./caffe_enet_test /apollo/modules/qperception/src/tailangle_calcu/example_data/lenet.prototxt /apollo/modules/qperception/src/tailangle_calcu/example_data/lenet_iter_10000.caffemodel

使用CMake

1. 在自己的 package 根目录中 添加 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 2.8)
project(tailangle_calcu)

set(CMAKE_CXX_STANDARD 11)

include_directories("/apollo/modules/qperception/src/lane_detector/scripts/ENet/caffe-enet/include") 
link_directories("/apollo/modules/qperception/src/lane_detector/scripts/ENet/caffe-enet/build/lib")   # libcaffe.so

# cuda
include_directories("/usr/local/cuda/include")
link_directories("/usr/local/cuda/lib64") 

set(SOURCE_FILES src/segmentation.cpp)
add_executable(caffe_enet_test ${SOURCE_FILES})

# opencv
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV_LIBS = ${OpenCV_LIBS}")
target_link_libraries(caffe_enet_test ${OpenCV_LIBS} )

# cublas是cuda的
target_link_libraries(caffe_enet_test libcaffe.so cublas boost_system glog)

2. 编译与执行

rr@in_dev_docker:/apollo/modules/qperception/src/tailangle_calcu$ mkdir build && cd build
rr@in_dev_docker:/apollo/modules/qperception/src/tailangle_calcu/build$ cmake ..
rr@in_dev_docker:/apollo/modules/qperception/src/tailangle_calcu/build$ make

rr@in_dev_docker:/apollo/modules/qperception/src/tailangle_calcu/build$ ./caffe_enet_test ../example_data/lenet.prototxt ../example_data/lenet_iter_10000.caffemodel 4