思岚科技a1雷达sdk linux下的cmake 工程搭建

本文记录思岚科技a1雷达SDK在linux下cmake 工程搭建的过程

  1. 描述
    slamtec的激光雷达SDK提供了linux支持,在目录下都有Makefile,直接在主目录下执行make,将会生成一个output文件夹和obj文件夹。obj中存放了编译过程生成的中间文件,output目录下则生成了一个静态链接库(可以在Makefile中修改使生成动态库)。
  2. 准备
    新建一个工程目录,假设为project,在该目录下建三个文件夹,分别为include/,share/,src/。将SDK中的所有头文件复制到include/,记住保持arch和hal的目录结构,否则会出现找不到头文件,将output中生成的RPlidar_sdk.a复制到share/,而src存放你写的代码,此处先使用SDK中提供的样例,将app/ultra_simple中的main.cpp复制到这个文件夹。
  3. 在探索中逐步搭建
    • 首先编写project下的CMakeLIsts.txt,代码如下:
      cmake_minimum_required(VERSION 3.1)
      project(ultra_simple)
      link_directories(share)
      include_directories(include)
      add_subdirectory(src)
    • 接着编写src下的CMakeLists.txt,代码如下:
      add_executable(ultra_simple main.cpp)
      target_link_libraries(ultra_simple librplidar_sdk.a)
  4. 解决问题
    • make后出现如下报错:
      In functionrp::hal::Thread::create(unsigned long ()(void), void*)’:
      thread.cpp:(.text+0x20): undefined reference to pthread_create'
      这样的报错有好多条,发现它们有个共同特点就是都出现了pthread。我并不知道这是什么,不过我知道SDK里有thread.h,thread.hpp,thread.cpp三个文件,应该和它们有关,同时,我查看了他提供的MakeFile,在第29行看到了这句LD_LIBS += -lstdc++ -lpthread,原来要链接pthread库,顺便查了一下,pthread是”POSIX threads”的缩写,是linux下的多线程表准。
      好,在CMakeLists.txt里给它加上编译参数。
      将project下的CMakeLists.txt修改如下:
      cmake_minimum_required(VERSION 3.1)
      project(ultra_simple)
      set(CMAKE_CXX_FLAGS "-lstdc++ -lpthread" )
      link_directories(share)
      include_directories(include)
      add_subdirectory(src)
    • make后再次出现同样错误
      怎么可能完全没用呢,我实在想不明白。于是,我想直接用g++试试。
      输入g++ main.cpp -lpthread -lstdc++ -I ../include/ -L../share/librplidar_sdk.a ,同样出错,但报错变了:
      main.cpp:(.text+0x184): undefined reference to rp::standalone::rplidar::RPlidarDriver::CreateDriver(unsigned int)'
      main.cpp:(.text+0x555): undefined reference to rp::standalone::rplidar::RPlidarDriver::DisposeDriver(rp::standalone::rplidar::RPlidarDriver*)

      彻底把我整晕了,到底怎么回事?于是,我只好给[email protected]写邮件求助。
    • 峰回路转
      等不及slamtec的回信,继续折腾。由于我在使用clion写的代码,当之前都是直接在命令行下写程序,对IDE不是很熟悉,发现 RPlidar_sdk.a上有个小问号,突然想到是不是没识别的意思?随便一搜,找到了这个结果。觉得collot的回答有点道理,点进他给的链接(Difference between -pthread and -lpthread while compiling),突然感觉涨知识了,不妨一试。于是,把-lpthread改为-pthread
      [ 50%] Building CXX object src/CMakeFiles/ultra_simple.dir/main.cpp.o
      [100%] Linking CXX executable ultra_simple
      [100%] Built target ultra_simple

      竟然真的成了!!!
    • 总结
      至此,我们已形成了一个模板,之后对slamtec 雷达的开发都可以在这基础上进行。

你可能感兴趣的:(问题解决汇总)