/home/pan/catkin_nbv/devel/include/voxblox/Layer.pb.h:10:10: fatal error: google/protobuf/port_def.inc: 没有那个文件或目录
10 | #include <google/protobuf/port_def.inc>
sudo ln -sf /usr/bin/protoc /home/pan/anaconda3/bin/protoc
which protoc
#创建软连接
ln -s /root/test.txt /home/user/test
#查看软连接
ls -l /home/user/test
#取消软连接
rm /home/user/test
#再次查看软连接,已经不存在
ls -l /home/user/test
2解决libresource_retriever.so:对‘curl_easy_init@CURL_OPENSSL_3’未定义的引用
该问题是ROS和Anaconda的兼容问题导致的,意思就是在编译过程中所使用的curl与libcurl无法匹配。原本在安装ros(默认是根据官方文档中的方法安装)的过程中,curl会被安装。然后在安装anaconda的过程中又会安装一种curl,另外还有可能你自己本身也有通过源码安装curl,几种不同版本的curl之间会造成冲突。
首先,查看系统所使用的curl
which curl
如果输出 /usr/bin/curl,则说明当前所使用的为ros安装的那个,如果输出~/anaconda3/bin/curl,则说明使用的是conda安装的,这里经过测试,更改系统使用的curl为ros安装的那个并不能消除错误。
有效的解决方法:强制所有的libcurl都指向ros要求使用的那个版本
首先我们查看出现问题的库文件libresource_retriever.so:
ldd /opt/ros/kinetic/lib/libresource_retriever.so | grep curl
得到了ros使用的libcurl版本:
libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4
接下来我们要将所有的libcurl库指向这个版本:
先locate所有的libcurl:
locate libcurl.so
可以看出除了系统/usr/lib/x86_64-linux-gnu/下的libcurl库,还有anaconda下的libcurl库;
列出anaconda下的libcurl库,可以看出libcurl.so.4指向的是libcurl.so.4.5.0版本(可能这就是不兼容的地方):
$ ll /home/ct/anaconda3/lib |grep libcurl
直接删除libcurl.so.4,将libcurl.so.4指向ros使用的版本/usr/lib/x86_64-linux-gnu/libcurl.so.4:
cd ~/anaconda3/lib
sudo rm libcurl.so.4
sudo ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0 libcurl.so.4(libcurl.so.4.4.0用自己的版本)
下是一个例子:
sudo rm libcurl.so.4
sudo ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4.5.0 libcurl.so.4
编译报错 undefined reference to `google::kLogSiteUninitialized‘ 的参考解决方法
3. 安装glog
首先卸载原有的sudo apt-get remove libgoogle-glog-dev
下载https://github.com/google/glog/tags 选择卸载掉系统中原来安装的glog,然后安装旧版本的glog,这里安装的版本是v0.5.0-rc2
:
mkdir build && cd build
cmake ..
make -j4
sudo make install
编译过程报错,修改安装包内的CMAKELIST文件
option (WITH_GTEST "Use googletest" OFF)
4 ubuntu18 anaconda3/lib/libfontconfig.so.1: undefined reference to `FT_Done_MM_Var‘ collect2: error:
这个问题主要是anconda什么什么版本不匹配之类的
问题原因在于
cd /usr/lib/x86_64-linux-gnu
ll |grep libfontconfig.so.1
cd ~/anaconda3/lib
ll | grep libfontconfig.so.1
在没有解决的时候,x86-64文件夹下的版本好是1.10.1, 而anaconda3里只有1.11.1
所以方法就是把1。10。1复制到anaconda文件夹下,删除原有链接并创建新链接
cp /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.10.1 ~/anaconda3/lib/libfontconfig.so.1.10.1
ls ~/anaconda3/lib/libfontconfig.so*
然后删除原有链接并创建新的
rm /home/pan/anaconda3/lib/libfontconfig.so
rm /home/pan/anaconda3/lib/libfontconfig.so.1
ln -s libfontconfig.so.1.10.1 libfontconfig.so.1
ln -s libfontconfig.so.1.10.1 libfontconfig.so
5 fatal error: google/protobuf/generated_message_table_driven.h: 没有那个文件或目录
protoc 与 头文件版本不匹配,port_def.inc是protobuf3.7.0版本之后才有的,
步骤1:卸载ubuntu原有的protoc
sudo apt-get remove libprotobuf-dev
which protoc // 查看可执行文件路径
sudo rm /usr/local/bin/protoc // 删执行文件
//(也可能是/usr/bin/protoc)
sudo rm -rf /usr/local/include/google //头文件(不需要我没有)
sudo rm -rf /usr/local/lib/libproto* //库文件(不需要)
2.安装
https://codeload.github.com/google/protobuf/zip/v3.2.0
下载https://codeload.github.com/google/protobuf/zip/v3.2.0
cd protobuf-3.2.0
./autogen.sh
./configure
sudo make
sudo make install
刷新动态库:(必须要执行这一步)
sudo ldconfig
完成后执行命令即可看到自己的刚安装的版本:
protoc --version
查看位置:
which protoc
安装后重新编译仍然显示报错、
解决方案打开gflags_catkin包修改其中的CMAKELIST
cmake_minimum_required(VERSION 2.8.3)
project(gflags_catkin)
find_package(catkin_simple REQUIRED)
catkin_simple()
include(ExternalProject)
file(MAKE_DIRECTORY ${CATKIN_DEVEL_PREFIX}/include)
install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/include/gflags
DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}
FILES_MATCHING PATTERN "*.h")
install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/lib/
DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
FILES_MATCHING PATTERN "libgflags*")
install(FILES ${CATKIN_DEVEL_PREFIX}/bin/gflags_completions.sh
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION})
cs_export(INCLUDE_DIRS ${CATKIN_DEVEL_PREFIX}/include
LIBRARIES gflags)
然后修改protobuf_catkin-master
if(USE_SYSTEM_PROTOBUF STREQUAL "ON")
message(STATUS "Using system protobuf.")
find_package(Protobuf REQUIRED)
set(PREFERRED_PROTOC_EXECUTABLE "/usr/local/bin/protoc" ${Protobuf_PROTOC_EXECUTABLE})
cs_install()
cs_export(INCLUDE_DIRS ${Protobuf_INCLUDE_DIRS}
LIBRARIES ${Protobuf_LIBRARIES}
CFG_EXTRAS protobuf-generate-cpp.cmake)
完美解决