tags: 嵌入式
categories: 開發(fā)
cmake 總結(jié)
交叉編譯
- 設(shè)置編譯器
CMAKE_FORCE_C_COMPILER($ENV{CROSS}gcc GNU) - 設(shè)置pkg-config執(zhí)行的位置
set(PKG_CONFIG_EXECUTABLE $ENV{PKG_CONFIG}) - 設(shè)置工程名
project(suma_middleware) - 設(shè)置工程的相關(guān)變量
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR mips)
基本功能
- 使用系統(tǒng)變量
增加$ENV{xxx},使用系統(tǒng)變量xxx,因為目前使用的交叉編譯的方法是使用source xxx.sh文件的方法將相關(guān)的變量增加到當(dāng)前終端的系統(tǒng)變量中昵时。所以需要大量的變量都是這種形式的扩所。 - 設(shè)置相關(guān)代碼子目錄
按照分層的結(jié)構(gòu),比如在下一層的src中有代碼允乐,使用如下的方式增加:
add_subdirectory(xxx)
以上方法需要確保xxx目錄中有CMakcLists.txt文件抗蠢。
設(shè)置頭文件查找位置
cmake文檔中使用
include_directories(xxx)
目前我的方法是使用:
set(dir)
list(APPEND dir ${dir1})
include_directories(${dir})
以上的方式來添加編譯的選項設(shè)置庫搜索的位置
link_directories(xxx)
查找xxx位置有無制定的庫薛躬。
可以按照頭文件設(shè)置的方法進行管理,這樣便于管理設(shè)置鏈接庫的名字
在生成對應(yīng)的可執(zhí)行程序(或者庫)后面執(zhí)行
target_link_libraries(xxx ${libname})
小坑:注意此處增加libname cmake會自動腦補成lib${libname}.so (或者a)的文件名僧界。-
使用pkg-config機制查找?guī)?/p>
配置package
find_package(PkgConfig)-
定義宏
macro(detectpkgconfig lib LIBNAME) pkg_check_modules(${LIBNAME} REQUIRED ${lib} ) message(STATUS 'lib is' ${lib}^^^ "${LIBNAME}_INCLUDE_DIRS is " ${${LIBNAME}_INCLUDE_DIRS}) message(STATUS ${lib}^^^ "${LIBNAME}_CFLAGS is " ${${LIBNAME}_CFLAGS}) set(${LIBNAME}_INCLUDE_DIRS) endmacro(detectpkgconfig)
調(diào)用宏
detectpkgconfig(directfb DIRECTFB)增加庫相關(guān)頭文件位置
include_directories(${DIRECTFB_INCLUDE_DIRS})增加庫位置
link_directories(${DIRECTFB__LIBRARY_DIRS})
生成可執(zhí)行文件
add_executable(demo main.c)
- 生成庫文件
add_library(xxx ${SRC_LIST}) (有變量可以定義生成的為靜態(tài)庫或者是動態(tài)庫)
坑
鏈接順序
編寫makefile的時候就容易踩得坑∏揉郑現(xiàn)在也需要注意庫的依賴順序和添加順序有關(guān)系。-
查找特定名稱的庫
因為之前項目中歷史遺留問題生成的庫沒有按照標(biāo)準(zhǔn)的libxx.a或者libxx.so寫法捂襟,需要手動制定特定的位置以及文件名咬腕。find_library(KERNEL_DRV NAMES xxx.a PATHS ${PROJECT_LIB_PATH}) 在指定的 PROJECT_LIB_PATH路徑下尋找xxx.a文件。生成變量保存在KERNEL_DRV_NAMES變量中葬荷。
編譯的不同時期執(zhí)行特定的腳本
部分項目涨共,因為屬于不同項目組,沒有統(tǒng)一編譯的環(huán)境宠漩,而且他們也不準(zhǔn)備花時間統(tǒng)一举反,所以用他們的最新的庫,需要使用腳本來進行編譯... ...
到此處扒吁,我用cmake改寫的過程中深深的體會到了火鼻,隊友的重要性。
add_custom_command(TARGET demo PRE_BUILD
COMMAND echo ARGS "##### build xxx start ###### "
WORKING_DIRECTORY $ENV{xxxxx})
在WORKING_DIRECTORY 目錄xxxxx中執(zhí)行腳本雕崩。對象為demo魁索,也就是說在編譯demo之前執(zhí)行以上腳本。但是cmake的文檔中好像提到PRE_BUILD只在特定的編譯環(huán)境有效果盼铁,所以在一般情況下粗蔚,表示鏈接階段。
總結(jié)
- cmake 語法的特點饶火,使用大寫變量表示變量類型
- prefix機制鹏控,不少地方定義一個變量xxx以后.實際是定義了一個${prefix}致扯,會有 cmake中,類似全局變量的${prefix}_xxx存在当辐,可以直接調(diào)用抖僵。比如前面說的pkg-config
疑問
- 變量的作用域。
- 變量的初始化瀑构,在改寫工程過程中,初始化已經(jīng)定義的list刨摩,不再有效寺晌。(類型設(shè)置有問題?澡刹?呻征?)
- 函數(shù)和marco的區(qū)別聯(lián)系初看文檔說是主要變量作用域的區(qū)別,暫時沒來得及細(xì)看罢浇,目前使用的是marco