如何使用Bazel构建PCL(点云库:https://github.com/PointCloudLibrary/pcl)?我已经成功使用OpenCV,如此处所述:Building OpenCV code using Bazel
当我对PCL执行相同的步骤时,会出现以下错误:
错误:
ERROR: /home/thomas/Projects/prome/bazel/lib/BUILD:15:1: C++ compilation of rule '//lib:hello-pcl' failed (Exit 1).
lib/pcl.cpp:3:10: fatal error: pcl/common/common_headers.h: No such file or directory
#include <pcl/common/common_headers.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Target //main:hello-world failed to build
我的系统:
我的文件夹结构:
├── lib
│ ├── BUILD
│ ├── ...
│ ├── pcl.cpp
│ └── pcl.h
├── main
│ ├── BUILD
│ ├── ..
│ └── hello-world.cc
├── opencv.BUILD
├── pcl.BUILD
└── WORKSPACE
我的工作空间(openCV有效):
new_local_repository(
name = "opencv",
path = "/usr/local",
build_file = "opencv.BUILD",
)
new_local_repository(
name = "pcl",
path = "/usr",
build_file = "pcl.BUILD"
)
我的个人资料已构建:
cc_library(
name = "pcl",
srcs = glob(["lib/x86_64-linux-gnu/*.so"]),
hdrs = glob(["include/pcl-1.8/pcl/**/*.hpp", "include/pcl-1.8/pcl/**/*.h"]),
includes = ["include"],
visibility = ["//visibility:public"],
linkstatic = 1,
)
我的二进制定义
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
"//lib:hello-opencv",
"//lib:hello-pcl",
"//lib:hello-time",
"@opencv//:opencv",
"@pcl//:pcl",
],
)
“ dpkg -L libpcl-dev”的结果:
https://github.com/tom-010/bazel-test/blob/master/dpgk_output
最后,失败的cpp代码(/lib/pcl.cpp):
#include "pcl.h"
#include <pcl/common/common_headers.h>
#include <pcl/visualization/pcl_visualizer.h>
void hello_pcl() {
// pcl stuff....
}
我在一个额外的项目中模拟了该错误,并将其上传到这里:https://github.com/tom-010/bazel-test 该项目是使用上述系统构建的。
没有包含的错误
当我删除#include-headers时:
#include "pcl.h"
void hello_pcl() {
// pcl stuff....
}
我收到以下错误:
[980 / 981] Linking main/hello-world
ERROR: /home/thomas/Projects/prome/bazel/main/BUILD:7:1: Linking of rule '//main:hello-world' failed (Exit 1).
/usr/bin/x86_64-linux-gnu-ld.gold: error: cannot find -lp11-kit-proxy
/usr/bin/x86_64-linux-gnu-ld.gold: error: cannot find -lpreloadable_libintl
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_pdread'
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_lgetregs'
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_lsetfpregs'
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_lgetfpregs'
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_getpid'
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_lsetregs'
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_pglobal_lookup'
bazel-out/k8-fastbuild/bin/_solib_k8/_U@pcl_S_S_Cpcl___Uexternal_Spcl_Slib_Sx86_U64-linux-gnu/libthread_db.so: error: undefined reference to 'ps_pdwrite'
collect2: error: ld returned 1 exit status
Target //main:hello-world failed to build
如果我从二进制定义的deps部分中删除此行,则不会发生这种情况:
# "@pcl//:pcl",
在我的CMake-Projekt中已经可以使用的PCL:
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
set(CLOUD_VIEWER_SOURCES
Viewer.cpp
Viewer.h)
add_library(cloud_viewer ${CLOUD_VIEWER_SOURCES})
target_link_libraries(cloud_viewer PRIVATE agent ${PCL_LIBRARIES})
target_include_directories(cloud_viewer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})