赞
踩
可以不使用cmake 里 link_directories 和 include_directories, 而是使用target_include_directories 和 target_link_libraries 这样方便对每一个target 进行精细控制
整体的cmakelist结构可以参照 https://github.com/gokhanettin/cmake-example
目前我将所有的cmakelist中都放入了“project”关键词,不知道这个会不会对后面有影响
关于cmake变量影响范围:
(1)在父级别定义的变量可以在子级别文件中看到。所以将所有的公用变量定义在了顶层
(2)只要库定义的名字正常,就能在各个级别之间互相引用
protobuf出现的File already exists in database,CHECK failed: generated_database_->Add(encoded_file_descriptor, size)。这个错误,是由于protobuf中存在全局静态的变量,如果引用了两次这个变量,就会产生两个初始化。造成这个错误。
可以看https://groups.google.com/g/protobuf/c/RZRCnOywdSk/m/s5QvifLCBgAJ?utm_medium=email&utm_source=footer 这个连接里有一些讨论
在我的情况下是由于common_proto库包含了所有的proto,直接引用产生,把这个改成common_error_proto就会让问题消失,后面再看看会遇到什么问题。
目前在gtest中还是有core dump的问题。表现是结果全部通过,但是core dump退出。还没有找到解决方案 从后面可以看出可能是:
(1)环境变量设置需要和apollo对齐
gtest和gmock 中的expect_that函数,存在segmentation fault问题,没有解决
在运行gtest过程中出现double free detected in tcache 2,然后core dump 的问题。
在gtest可执行文件的编译过程中,如果去掉gmock,能编译通过,表明没有引用gmock的代码。那么此时运行不会出现segmentfautl 或者coredump的问题
可能是gmock的版本和引用问题。考虑重新安装新版gtest.
重新安装过后,依然不行。
换新版本的过程,遇到DSO错误,提示和pthread相关,在target_link_libraries中添加pthread,注意这里添加的位置也会影响编译结果,不知道为什么。能解决问题,编译用过,运行有问题。没法pass
如果换回原版本,删除pthread能正常编译,能pass所有test,但是会中间爆出错误,并且最后会segmentation fault,不知道为什么
在测试cyber time clock的时候,仔细观察打开文件失败等错误,会发现是因为没有在系统中设置cyber路径导致,cyber路径环境变量:export CYBER_PATH=your_path/apollo/cyber设置完之后就可以了
关于cmake add_custom_command的问题,https://cmake.org/cmake/help/latest/guide/tutorial/Selecting%20Static%20or%20Shared%20Libraries.html。这个官方连接有一些讲解。这个命令应该是可以执行一些shell命令。
在apollo编译protobuf文件的时候,用到了这个方法添加protoc command
这个方法也可以用来生成一些源码文件,并把源码文件在后面添加成编译源文件
关于cmake中INTERFACE PUBLIC PRIVATE关键词的讲解,可以看这个https://leimao.github.io/blog/CMake-Public-Private-Interface/
在编译common util perf util的过程中,absl link 出错误,说没有办法编译静态库,去absl安装文件发现,编译的都是静态 .a , 所以在这个common_util_perf_util 库的add_library上增加STATIC注释就通过了,但是这导致了这个库和别的类型不太一样,有没有问题需要看看。
经过测试,在编译abseil库的过程中添加-DCMAKE_
关于为什么要用target_include_directories(common_math_angle PUBLIC ${common_math_dir}) 这个指令,而不是直接在add_library中添加头文件比如:add_library(common_math_angle angle.cc angle.h)。这样做是为了别人引用的方便,不然引用路径上会有问题
这个tinyxml2神坑,坑了一上午,之前安装ros之类的时候应该是安了一个版本的tinyxml最后也布吉岛好不好使,现在下了个最新版本的tinyxml2,为了编译它把cmake都换了,也不知道会不会影响后续ros的编译。结果发现只要把tinyxml2的cpp和h 文件放到一个地方直接自己cmake一下就好了,别的库去link它就行,白费了半天时间
map hdmap 这个库的编译比较麻烦,因为它内部的adapter和xml parser没有单元测试代码,所以在这里卡了半天,主要是写cmake list的各种粗心错误。经验是一定要完完全全仔仔细细的按照bazel文件的配置进行编译。编译过程中更新了proj4库,ubuntu18.04本身的库有点老,很多函数没有,更新之后就会少一个link错误。
还有就是要仔细看编译错误给出的位置,undefined reference错误位置也是对的
按照Eigen官网推荐的cmakelists配置在ubuntu18.04 下会产生eigen dense no such file or directory问题,直接将所有的Eigen/Dense 替换为eigen3/Eigen/Dense就可以
并且在包含absl/strings/str_cat.h的时候,同样也会出现no such file or directory 的问题,这个布吉岛是哪的问题,目前解决方案是在顶层cmakelists中添加include_directories(path_to_absl)
在编译relative map navigation lane lib 的过程中发现,这个bazel写的和我之前理解的又不太一样,感觉缺东西,每每出现undefined reference之后,在根据需求添加相应的link库
应该是这个lib直接link了cyber库,这样就包含了cyber中的所有lib,但是目前我还没有编译cyber
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。