据说目前已经有更为现代化的cmake,先不说现代化的cmake如何如何.本文记录是目前工作后又遇到的常规cmake的问题。不确定是否高版本的cmake已经解决了一些自身的问题.本文只做记录.
cmake 持续记录
-
CMakeLists.txt 这个
文件名在构建的时候是固定的,除非使用include包含其他的以.cmake后缀结尾的文件,比如工具链文件. -
一般会在CMakeLists.txt这个文件下创建build目录,在build目录下执行cmake… 然后
make clean all -j8,若是不指定输出库和可执行文件的目录,则默认会在build下的对应目录(一般是子目录)下生生成. -
若是修改了CMakeLists.txt,不需要重新执行cmake … 直接make 会默认去执行cmake … (从中看出cmake是比较
智能的). -
通常,当项目编译很慢的时候,执行make -j8 (
-j8 表示使用多线程),如果发生报错,再执行make(这个时候不加-j xxx则能快速定位到错误所在. -
cmake的子目录能共享父目录里面的变量,父目录不能直接共享子目录里面的变量.
-
cmake链接到库的问题: 若是由当前的工程生成的库(无论是
静态库还是动态库,可以直接通过库名进行链接,若是使用外部非当前工程生成的库,需要指定外部库的路径,再使用其外部库的库名(去掉前缀和后缀)链接.或者是直接使用外部库的绝对路径链接,再或者是使用find_library查找一番,.在交叉编译时,在link到外部库时,我建议还是使用绝对路径(这是一种保险的做法,一是为了区分外部库和当前生成的库,二是因为有时候虽然指定了外部库的link路径,然后直接使用库名链接却依然找不到库(无论有没有删除cmake的缓存). -
使用
find_library赋值的变量会存在缓存,需要删除cmake的cache文件,以免产生影响. -
交叉编译配置交叉编译工具链正确,当编译出的可执行程序却无法运行:

报错xxx(可执行程序) not found这个问题可能是CFLAGS或者 是CXXFLAGS还需要附带一些和芯片相关的参数(比如处理器的类型和架构)
比如在milkv-duo中交叉编译中,仓库用的是makefile构建,改成cmake 构建,需要加编译参数如-mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d
制作库持续记录.
-
解决命名冲突,虽然它一直是个诟病的地方,不要使用全局变量,C++变量都用命名空间来进行管理,C的话能不能用结构体来代替.
-
规范的用一个头文件进行声明,表示库里的函数和命名空间.
-
C++使用C编译而来的库,extern "C {头文件} 。因为
C++和C的编译方式不一样,比如函数名字,经常会因为使用外部库,(问题还在于你不问问根本不知道是C的库还是C++的库),经常因为这个问题导致找不到函数符号.如果是C用C++的话,还不如直接把C文件改成C++文件.
本文主要记录了在实际工作中遇到的CMake配置问题,包括CMakeLists.txt的使用、多线程构建、库链接、交叉编译中的注意事项以及如何解决命名冲突,强调了命名空间管理和正确处理C++与C库的兼容性问题。
722

被折叠的 条评论
为什么被折叠?



