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

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

阿曾

2010.3.9

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

参考资料:

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

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

一 Cmake 语法基础

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

,README,runhello.sh.

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

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

PROJECT (HELLO)

SET(CMAKE_INSTALL_PREFIX /tmp/cmake/hello2)

INSTALL(FILES COPYRIGHT README DESTINATION share/doc)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)

INSTALL(DIRECTORY doc/ DESTINATION share/doc)

#INSTALL(TARGETS hello RUNTIME DESTINATION bin)

ADD_SUBDIRECTORY(src bin)

在src目录下的CMakeLists.txt内容

SET(SRC_LIST main.c)

MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir" ${HELLO_SOURCE_DIR})

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/binary_output)

ADD_EXECUTABLE(hello ${SRC_LIST})

INSTALL(TARGETS hello RUNTIME DESTINATION bin)

在工程目录下的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.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这条命令。它添加的是算术运算共享库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值