在Linux平台上使用Cmake进行交叉编译替代嵌入式平台所使用的Makefile
阿曾
2010.3.9
嵌入式平台编写了一个大项目,一直使用的是Makefile,现在要改为Cmake,之前没有碰过Cmake,开始现学现用。
参考资料:
《在 linux 下使用 CMake 构建应用程序》--在IBM developerWorks上的一篇文章
《Cmake实践》-- 非常好的教程
一 Cmake 语法基础
,README,runhello.sh.
在doc下面有hello.txt.在src下面有main.c,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)
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)
cmake ..
然后执行
make
make install
/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。
.
├── 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文件夹,分别是编码端和解码端代码。
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) 要求都最低版本号
INCLUDE_DIRECTORIES(${kta_SOURCE_DIR}/lencod/inc) 添加头文件存放路径,不然就会出现头文件找不到都错误。
MESSAGE(STATUS "KTA BINARY DIR is ",${kta_SOURCE_DIR}/bin) 打印出目标二进制可执行程序都存放路径。
TARGET_LINK_LIBRARIES(lencod m)为可执行程序链接共享库,也就是替代了Makefile里面都-lm这条命令。它添加的是算术运算共享库。