在Linux平台上使用Cmake進行交叉編譯替代嵌入式平台所使用的Makefile

來源:互聯網
上載者:User

在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內容

PROJECT (HELLO)<br />SET(CMAKE_INSTALL_PREFIX /tmp/cmake/hello2)<br />INSTALL(FILES COPYRIGHT README DESTINATION share/doc)<br />INSTALL(PROGRAMS runhello.sh DESTINATION bin)<br />INSTALL(DIRECTORY doc/ DESTINATION share/doc)<br />#INSTALL(TARGETS hello RUNTIME DESTINATION bin)<br />ADD_SUBDIRECTORY(src bin)

在src目錄下的CMakeLists.txt內容

SET(SRC_LIST main.c)<br />MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})<br />MESSAGE(STATUS "This is SOURCE dir" ${HELLO_SOURCE_DIR})<br />SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/binary_output)<br />ADD_EXECUTABLE(hello ${SRC_LIST})<br />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 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這條命令。它添加的是算術運算共用庫。






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.