在Linux平台上使用Cmake进行交叉编译替代嵌入式平台所使用的Makefile

在Linux平台上使用Cmake进行交叉编译替代嵌入式平台所使用的Makefile

阿曾

2010.3.9

 嵌入式平台编写了一个大项目,一直使用的是Makefile,现在要改为Cmake,之前没有碰过Cmake,开始现学现用。

参考资料:

在 linux 下使用 CMake 构建应用程序》--在IBM developerWorks上的一篇文章


Cmake实践》-- 非常好的教程


http://blog.csdn.net/netnote/article/details/4051620  总结的很好


一 Cmake 语法基础

在工程目录hello文件夹下面有三个文件夹,分别是build,doc,src,文件分别有CMakeLists.txt,COPYRIGHT,R,E

,README,runhello.sh.

在doc下面有hello.txt.在src下面有main.c,CMakeLists.txt

在工程目录下的CMakeLists.txt内容

在src目录下的CMakeLists.txt内容

在工程目录下的build下面执行

cmake ..

将在build目录下生成各种Cmake的中间产物。

然后执行

make

make install

将各种安装文件按照CMAKE_INSTALL_PREFIX的目录安装。

这样将在/tmp/camke/hello2目录下生成几个目录

/tmp/camke/hello2/bin,下面有hello,runhello.sh

/tmp/camke/hello2/share/doc,下面有COPYRIGHT,README,hello.txt


二 以 jm11.0kta1.2为例编写cmake需要的CMakeLists.txt

 jm11.0kta1.2 download website:  http://iphome.hhi.de/suehring/tml/download/KTA/

 jm11.0kta1.2.zip解压后的文件夹名为JMKTA。
JMKTA的目录结构如下
.
├── bin
│   ├── decoder.cfg
│   ├── encoder_baseline.cfg
│   ├── encoder.cfg
│   ├── encoder_extended.cfg
│   ── xxxxxxxxxxxxxxxxxxxxxxx
│   ├── q_matrix_def.cfg
│   ├── q_offset.cfg
│   ├── sg0conf.cfg
│   ├── sg2conf.cfg
│   └── sg6conf.cfg
├── Changes_detail.txt
├── CHANGES.TXT
├── copyright.txt
├── disclaimer.txt
├── doc
│   ├── coding_style.doc
│   ├── doxygen.txt
│   ├── foot.html
│   ├── h26l.css
│   ├── ldecod.dox
│   └── lencod.dox
├── Doxyfile
├── FREXT_changes.txt
├── KTA_CHANGES.TXT
├── lcommon
│   ├── inc
│   └── src
├── ldecod
│   ├── inc
│   │   ├── adaptive_filter.h
│   │   ├── adaptive_quantization.h
│   │   ├── xxxxxxxxxxxxxxxxxxxxxxx
│   │   ├── output.h
│   │   ├── parsetcommon.h
│   │   ├── parset.h
│   │   ├── rtp.h
│   │   ├── sei.h
│   │   ├── spatial_domain_coding.h
│   │   ├── transform8x8.h
│   │   └── vlc.h
│   ├── Makefile
│   ├── obj
│   └── src
│       ├── adaptive_filter.c
│       ├── adaptive_quantization.c
│       ├── annexb.c
│       ├── xxxxxxxxxxxxxxxxxxxxxxx
│       ├── parsetcommon.c
│       ├── rtp.c
│       ├── sei.c
│       ├── spatial_domain_coding.c
│       ├── transform8x8.c
│       └── vlc.c
├── ldecod.dsp
├── ldecod.dsw
├── ldecod.kdevelop
├── ldecod.kdevelop.filelist
├── ldecod.vcproj
├── lencod
│   ├── inc
│   │   ├── adaptive_filter.h
│   │   ├── adaptive_quantization.h
│   │   ├── annexb.h
│   │   ├── xxxxxxxxxxxxxxxxxxxxxxx
│   │   ├── refbuf.h
│   │   ├── rtp.h
│   │   ├── sei.h
│   │   ├── simplified_fast_me.h
│   │   ├── spatial_domain_coding.h
│   │   ├── transform8x8.h
│   │   └── vlc.h
│   ├── Makefile
│   ├── obj
│   └── src
│       ├── adaptive_filter.c
│       ├── adaptive_quantization.c
│       ├── annexb.c
│       ├── biariencode.c
│       ├── block.c
│       ├── xxxxxxxxxxxxxxxxxxxxxxx
│       ├── simplified_fast_me.c
│       ├── slice.c
│       ├── spatial_domain_coding.c
│       ├── transform8x8.c
│       ├── vlc.c
│       └── weighted_prediction.c
├── lencod.dsp
├── lencod.dsw
├── lencod.kdevelop
├── lencod.kdevelop.filelist
├── lencod.vcproj
├── Readme.txt
├── rtpdump
│   ├── ReadMe.txt
│   ├── rtpdump.cpp
│   ├── rtpdump.dsp
│   ├── rtpdump.vcproj
│   ├── StdAfx.cpp
│   └── StdAfx.h
├── tml.dsw
├── tml.sln
└── unixprep.sh

bin文件夹里面有可执行程序的配置参数。
doc里面是文档,而且居然给的是word版。
主要用到的是lencod和ldecod文件夹,分别是编码端和解码端代码。
假如JMKTA文件夹在个人目录下。进入JMKTA文件夹

cd ~/JMKTA
vim CMakeLists.txt

PROJECT(kta)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
ADD_SUBDIRECTORY(lencod)


cd lencod

vim CMakeLists.txt

ADD_SUBDIRECTORY(src)


cd src

vim CMakeLists.txt

AUX_SOURCE_DIRECTORY(. DIR_SRCS)
INCLUDE_DIRECTORIES(${kta_SOURCE_DIR}/lencod/inc)
ADD_EXECUTABLE(lencod ${DIR_SRCS})
SET(EXECUTABLE_OUTPUT_PATH ${kta_SOURCE_DIR}/bin)
MESSAGE(STATUS "KTA BINARY DIR is ",${kta_SOURCE_DIR}/bin)
TARGET_LINK_LIBRARIES(lencod m)


推荐采用外部构建的方法,在KTA文件夹里面新建一个build文件夹构建工程。当然,这个文件夹放任何地方都可以。
cd ~/JMKTA
mkdir build
cmake ..
make

然后可执行程序lencod在~/JMKTA/bin里面。

现在我们来分析一下几个CMAKE的基本语句。

  • PROJECT(kta)定义工程名,后面的变量kta_SOURCE_DIR就是指这个工程路径。
  • CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 要求都最低版本号
  • ADD_SUBDIRECTORY(lencod) 增加存放源文件都子目录
  • AUX_SOURCE_DIRECTORY(. DIR_SRCS)  将当前目录中的源文件名称赋值给变量 DIR_SRCS
  • INCLUDE_DIRECTORIES(${kta_SOURCE_DIR}/lencod/inc) 添加头文件存放路径,不然就会出现头文件找不到都错误。
  • ADD_EXECUTABLE(lencod ${DIR_SRCS}) 定义可执行文件名为lencod,相关源文件类表是变量DIR_SRCS的值。这时候当前目录中有多少文件都不怕了,CMAKE会自动编译并处理好依赖关系。
  • SET(EXECUTABLE_OUTPUT_PATH ${kta_SOURCE_DIR}/bin) 认为设置目标二进制可执行程序存放地址为工程源代码存放路径下,根据个人情况而定。我这里和KTA的Makefile保持了一致。
  • MESSAGE(STATUS "KTA BINARY DIR is ",${kta_SOURCE_DIR}/bin) 打印出目标二进制可执行程序都存放路径。
  • TARGET_LINK_LIBRARIES(lencod m)为可执行程序链接共享库,也就是替代了Makefile里面都-lm这条命令。它添加的是算术运算共享库。









  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux使用CMake进行交叉编译的步骤如下: 1. 首先,需要编写一个适用于目标平台的工具链文件。这个文件可以指定交叉编译工具的路径、系统名称等信息。例如,可以在工具链文件中设置CMAKE_SYSTEM_NAME为Linux,指定交叉编译工具的路径为TOOLCHAIN_PATH。 2. 在执行CMake命令开始构建时,可以使用参数--toolchain或者-DCMAKE_TOOLCHAIN_FILE=指定工具链文件的路径。这样,CMake就会使用指定的工具链文件进行交叉编译。 举个例子,假设工具链文件的路径为/path/to/toolchain-file.cmake,可以使用以下命令进行交叉编译cmake ... --toolchain=/path/to/toolchain-file.cmake 或者 cmake ... -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain-file.cmake 这样,CMake就会根据工具链文件中的设置进行交叉编译,生成适用于目标平台的库文件或可执行文件。 引用内容: [1] 交叉编译笔者在工作中经常会遇到。笔者开发使用的宿主机一般都是Linux(Ubuntu),交叉编译的目的基本都是为了将程序代码编译成目标嵌入式平台的库文件,然后再在目标系统上调用集成,一般都是ARM系列的CPU。而对于不同操作系统(Windows、Linux、MacOS)之间的交叉编译,则主要是为了编译示例程序,方便在不同操作系统上进行展示或者调试。 [2] toolchain.cmake set(CMAKE_SYSTEM_NAME Linux) #这里以Linux为例 set(TOOLCHAIN_PATH /home/test/src/func/build) 这里指定toolchain的目录 set(TOOLCHAIN_PATH ${tools}/usr/local/arm/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc) 这里指定交叉编译工具的路径 set(TOOLCHAIN_PATH ${tools}/usr/local/arm/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g ) 这里指定交叉编译工具的路径 [3] 在需要进行交叉编译的时候,先编写一个适用于目标平台的工具链文件,然后在执行cmake命令开始构建时,可以使用参数--toolchain或者-DCMAKE_TOOLCHAIN_FILE=指定工具链文件的路径即可: cmake...--toolchain<path/to/toolchain-file> #or cmake...-DCMAKE_TOOLCHAIN_FILE=<path/to/toolchain-file>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值