大家晚上好,在這里祝大家端午安康。今天給大家分享的是工程管理工具cmake,沒有先介紹makefile工程管理工具(坦白來(lái)說,這兩者都差不多,cmake最終還是會(huì)生成Makefile的,只是說cmake語(yǔ)法稍微比較簡(jiǎn)單一些,沒有Makefile那么復(fù)雜!)。就自己個(gè)人經(jīng)歷,現(xiàn)在一般公司去寫Makefile和cmake的比較少(當(dāng)然去招聘網(wǎng)站上,有的時(shí)候還是可以看到有這個(gè)技能要求會(huì)寫的,所以說能夠自己寫出來(lái)是最為完美的?。?,一般都是直接使用廠家的Makefile或者Cmake;但作為學(xué)習(xí),還是要認(rèn)真學(xué)習(xí)里面的原理,比如出現(xiàn)了錯(cuò)誤,你要能夠定位到錯(cuò)誤并把它解決掉,因?yàn)榭赡苠e(cuò)誤就出現(xiàn)在配置好的Makefile或者Cmake里面,所以你要看的懂里面代碼的意思(也就是說,你知道這個(gè)工具是這樣用,但是也要明白它的原理機(jī)制,做到之知其然,知其所以個(gè)然來(lái)?。@樣才能把問題解決掉。
而且就個(gè)人見解,在傳統(tǒng)的linux工程管理用Makefile的比較多(Uboot里面也是大量使用Makefile來(lái)進(jìn)行管理工程);在新型領(lǐng)域,比如物聯(lián)網(wǎng)開發(fā)(特別是一些開源項(xiàng)目等),用Cmake的比較多(當(dāng)然也有可能是例外哈?。?;好了,廢話就不多說了,開始來(lái)學(xué)習(xí)了:
一、Cmake學(xué)習(xí)使用:
1、安裝Cmake管理工具:
一般實(shí)際嵌入式linux開發(fā),幾乎都是用Ubuntu來(lái)開發(fā)的,因?yàn)槟巧叮惭b啥應(yīng)用程序的非常方便,只需一個(gè)命令“apt install + 應(yīng)用程序名稱” 大部分都直接搞定,不用再去配置(特殊的,就例外,還要一些其他相關(guān)配置!),安裝Cmake就是一條命令直接搞定:
root@txp-virtual-machine:/home/txp# apt install cmake
Reading package lists... Done
Building dependency tree
2、先從一個(gè)簡(jiǎn)單示例,來(lái)得出一般書寫步驟規(guī)律:
這里先寫一個(gè)簡(jiǎn)單的代碼工程main.c,然后再使用我們的cmake來(lái)管理代碼工程:
#include <stdio.h>
int main(void)
{
printf("TXP嵌入式");
return 0;
}
然后開始寫cmake工程管理文件,我在當(dāng)前目錄建立一個(gè)CMakeLists.txt文件,然后再往里面開始工程管理代碼
root@txp-virtual-machine:/home/txp/test# pwd
/home/txp/test
root@txp-virtual-machine:/home/txp/test# touch CMakeLists.txt
root@txp-virtual-machine:/home/txp/test# ls
CMakeLists.txt main.c
CMakeLists.txt文件里面的內(nèi)容如下:
cmake_minimum_required (VERSION 2.8)
project (main)
add_executable(main main.c)
解釋一下這三條語(yǔ)句分別代表什么意思:
1、表示cmake最低執(zhí)行版本是2.8才有效來(lái)管理我們的工程項(xiàng)目。
2、表示整個(gè)工程名為main
3、表示最終要生成的elf文件的名字叫main,使用的源文件是main.c
現(xiàn)在我們來(lái)實(shí)現(xiàn)cmake的功能,在當(dāng)前目錄下,使用命令"cmake ."(.表示當(dāng)前目錄,而..表示上一級(jí)目錄),生成makefile等相關(guān)文件;然后再執(zhí)行一下make命令進(jìn)行編譯工程,就能生成可執(zhí)行文件main了,同時(shí)也會(huì)生成makefile文件,最后就可以執(zhí)行可執(zhí)行main文件,就能得到我們所要的結(jié)果:
root@txp-virtual-machine:/home/txp/test# cmake .
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/txp/test
root@txp-virtual-machine:/home/txp/test# ls
CMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt main main.c Makefile
root@txp-virtual-machine:/home/txp/test# make
Scanning dependencies of target main
[100%] Building C object CMakeFiles/main.dir/main.c.o
Linking C executable main
[100%] Built target main
root@txp-virtual-machine:/home/txp/test# ./main
TXP嵌入式
如果你再好奇一下的話,可以打開看看Makefile里面的內(nèi)容是啥,很容易想到是用makefile的方式來(lái)實(shí)現(xiàn)對(duì)工程main的管理,這里我就不畫蛇添足把源代碼貼出來(lái)了。cmake_install.cmake 是一些相關(guān)配置選項(xiàng):
# Install script for directory: /home/txp/test
# Set the install prefix
IF(NOT DEFINED CMAKE_INSTALL_PREFIX)
SET(CMAKE_INSTALL_PREFIX "/usr/local")
ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX)
STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# Set the install configuration name.
IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
IF(BUILD_TYPE)
STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
ELSE(BUILD_TYPE)
SET(CMAKE_INSTALL_CONFIG_NAME "")
ENDIF(BUILD_TYPE)
MESSAGE(STATUS "Install configuration: "${CMAKE_INSTALL_CONFIG_NAME}"")
ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
# Set the component getting installed.
IF(NOT CMAKE_INSTALL_COMPONENT)
IF(COMPONENT)
MESSAGE(STATUS "Install component: "${COMPONENT}"")
SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
ELSE(COMPONENT)
SET(CMAKE_INSTALL_COMPONENT)
ENDIF(COMPONENT)
ENDIF(NOT CMAKE_INSTALL_COMPONENT)
# Install shared libraries without execute permission?
IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
SET(CMAKE_INSTALL_SO_NO_EXE "1")
ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
IF(CMAKE_INSTALL_COMPONENT)
SET(CMAKE_INSTALL_M(jìn)ANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
ELSE(CMAKE_INSTALL_COMPONENT)
SET(CMAKE_INSTALL_M(jìn)ANIFEST "install_manifest.txt")
ENDIF(CMAKE_INSTALL_COMPONENT)
FILE(WRITE "/home/txp/test/${CMAKE_INSTALL_M(jìn)ANIFEST}" "")
FOREACH(file ${CMAKE_INSTALL_M(jìn)ANIFEST_FILES})
FILE(APPEND "/home/txp/test/${CMAKE_INSTALL_M(jìn)ANIFEST}" "${file}")
ENDFOREACH(file)
~
而CMakeFiles是一個(gè)文件夾,里面文件內(nèi)容如下:
root@txp-virtual-machine:/home/txp/test/CMakeFiles# ls
2.8.12.2 cmake.check_cache CMakeDirectoryInformation.cmake
CMakeOutput.log CMakeTmp main.dir Makefile2
Makefile.cmake progress.marks TargetDirectories.txt
-
IC設(shè)計(jì)
+關(guān)注
關(guān)注
38文章
1302瀏覽量
104211 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19201
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論