vscode中,使用ros自带的pcl配置代码并编译时,报错:在函数“xx”中: 对“多个函数 ”未定义的引用

目录

网上参考的解决方案

cmakelist报错解决,增加package

json中进行库连接完成解决

所使用方案

单独进行pcl测试的cmakelist

项目中使用的

配置serial


编译时报错,存在多个未定义的引用,如

在函数‘main’中:

/home/nvidia/Music/fitline/fit.cpp:20:对‘pcl::visualization::PCLVisualizer::PCLVisualizer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)’未定义的引用

对‘pcl::visualization::PCLVisualizer::PCLVisualizer’未定义的引用

这个是一个主要问题,解决了较长时间

网上参考的解决方案
cmakelist报错解决,增加package

这种方式适用于大型项目,通过几个变量可以配置完全整个项目的所需

vscode中手动设置tasks.json需要为g++添加许多include和库文件,这些文件很难找全导致编译失败,使用cmake并编写配套的CMakeList.txt可以解决这个问题;

vscode中包含的库文件出现红色下划线,需要在c_cpp_properties.json中设置compileCommands文件的路径,并在tasks.json中设置cmake生成compile_commands.json文件;

# 1.前提
cmake_minimum_required(VERSION 3.2) #最低camke版本需求
PROJECT(test) #创建工程,example为工程名

SET(CMAKE_BUILD_TYPE Debug) #debug模式
#SET(CMAKE_BUILD_TYPE Release) #Release模式

# 2.需要的依赖库
find_package(OpenCV 4.2)
find_package(Eigen3 3.1.0 REQUIRED)
find_package(Pangolin REQUIRED)
find_package(realsense2)

# 3.设置可执行文件与链接库保存的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

# 4.设置头文件目录使得系统可以找到对应的头文件
include_directories(
${PROJECT_SOURCE_DIR}/include  #自己目录的头文件
${EIGEN3_INCLUDE_DIR}          #其他系统目录的头文件 也可以直接写路径/usr/include/eigen3
${Pangolin_INCLUDE_DIRS}
)

# 5.编译动态库并链接库文件
add_library(${PROJECT_NAME} SHARED
src/IMUPreIntergral.cpp
include/IMUPreIntergral.h
)
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
-lboost_serialization
-lcrypto
)

# 6.生成可执行文件
#选择需要编译的源文件,有几个文件写几个
add_executable(IMUPreIntergral src/IMUPreIntergral.cpp)
target_link_libraries(IMUPreIntergral ${PROJECT_NAME})

#add_executable(IMUPreIntergral src/IMUPreIntergral.cpp)
#target_link_libraries(IMUPreIntergral ${PROJECT_NAME})
json中进行库连接完成解决

主要是通过-i添加头文件路径,通过-L -l添加链接库的路径,这种方式的缺点是如果项目过大(如PCL),则配置库的工作量大,容易遗漏

g++命令用于编译和链接C++程序,其中包括链接库(libraries)的选项。要连接库,你需要使用-l选项,后跟库的名称。通常,库的名称应该省略文件扩展名(例如.a或.so),并且g++将在默认的库目录中查找这些库。

g++ -o my_program my_program.cpp -lmylib

-o my_program选项指定输出可执行文件的名称为my_program。
my_program.cpp是你的C++源代码文件。
-lmylib选项告诉g++连接名为libmylib.so(或libmylib.a,具体取决于库的类型)的库。请注意,-l选项后面的库名是去掉前缀lib和文件扩展名的,如果库文件实际名称是libmylib.so,你只需使用-lmylib

使用 -l 参数查找连接库的时候是不需要添加前缀 lib与 动态库后缀 .so或者静态库后缀.a,并且不需要在库的前面添加库的绝对路径的,需要使用-L参数来制定库的路径。

于是修改为以下命令

g++ test.cpp -o run -I /tmp/usr/local/include/ -L /tmp/usr/local/lib/ -lserial

在vscode中引用自定义头文件时,如果出现undefined reference to 错误,可能是因为没有正确配置编译器,或者没有正确添加头文件路径。

解决方法:

1.正确配置编译器,在vscode中打开设置,搜索“c_cpp_properties.json”,打开该文件,在includePath中添加自定义头文件的路径;

2.在编译时,添加头文件路径,在编译器中添加-I参数,指定头文件的路径;

3.在编译时,添加库文件路径,在编译器中添加-L参数,指定库文件的路径;

4.在编译时,添加链接库,在编译器中添加-l参数,指定链接库的名称。

所使用方案

由于项目包含了过多的依赖库,需要库文件一个个配置太麻烦,尝试json失败后,选择了学习cmakelist的方式

单独进行pcl测试的cmakelist
cmake_minimum_required(VERSION 2.6)
project(pcl_test)

find_package(PCL 1.9 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(pcl_test pcl_test.cpp)

target_link_libraries (pcl_test ${PCL_LIBRARIES})

install(TARGETS pcl_test RUNTIME DESTINATION bin)
项目中使用的
cmake_minimum_required(VERSION 3.0) #最低camke版本需求
project(fitmo) # 创建工程,fitmo工程名

# 需要的依赖库
find_package(PCL 1.8 REQUIRED)

# 4.设置头文件目录使得系统可以找到对应的头文件

include_directories(
    ${PROJECT_SOURCE_DIR}/include  #自己目录的头文件
    ${PCL_INCLUDE_DIRS} #其他系统目录的头文件 也可以直接写路径/usr/include/eigen3
    )

link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
# 生成可执行文件
add_executable(fitmo fit.cpp FitModule.cpp)#选择需要编译的源文件,有几个文件写几个
target_link_libraries (fitmo ${PCL_LIBRARIES})

install(TARGETS fitmo RUNTIME DESTINATION bin)
配置serial

原来环境中没有serial.h,所以使用了一个现安装的,重新下载cmake装了一下

c++通过serial库进行上下位机通信 - 知乎

GitHub - wjwwood/serial: Cross-platform, Serial Port library written in C++

安装好的库,需要在cmakelist里面进行配置,对应文件如下,在列表里面有serial相关的

cmake_minimum_required(VERSION 3.0) #最低camke版本需求
project(fitmo) # 创建工程,fitmo工程名

# 需要的依赖库
find_package(PCL 1.8 REQUIRED)

# 4.设置头文件目录使得系统可以找到对应的头文件

include_directories(
    ${PROJECT_SOURCE_DIR}/include  #自己目录的头文件
    ${PCL_INCLUDE_DIRS} #其他系统目录的头文件 也可以直接写路径/usr/include/eigen3
    /home/nvidia/Music/serial-main/include
    )
link_directories(
    ${PCL_LIBRARY_DIRS}
    "/home/nvidia/Music/serial-main/build/devel/lib"
)
add_definitions(${PCL_DEFINITIONS})
# 生成可执行文件
add_executable(fitmo fit.cpp FitModule.cpp)#选择需要编译的源文件,有几个文件写几个
target_link_libraries (fitmo ${PCL_LIBRARIES} -lserial)

install(TARGETS fitmo RUNTIME DESTINATION bin)

参考:

https://www.cnblogs.com/ghjnwk/p/10457586.html

使用Ros自带的Pcl-CSDN博客

vscode:CmakeList编写+编译调试_cmakelist debug-CSDN博客

在ubuntu上安装pcl库并配置vscode使用cmake生成可执行文件-CSDN博客

在ubuntu上安装pcl库并配置vscode使用cmake生成可执行文件-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值