cmake 入门学习
生活随笔
收集整理的這篇文章主要介紹了
cmake 入门学习
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
https://alenstar.github.io/post/cmake_template/
?
首先我們來(lái)看看我們的工程目錄結(jié)構(gòu)
$ tree myprojectmyproject # 工程目錄 ├── CMakeLists.txt # 入口CMakeLists.txt文件 ├── example.c ├── include # 頭文件目錄 │ ├── arch.h │ ├── base.h │ ├── common.h │ └── data.h ├── LICENSE ├── README.md └── src # 源代碼目錄├── arch.c├── base.c├── CMakeLists.txt # 子CMakeLists.txt文件├── common.c└── data.c入口CMakeLists.txt文件分析
# 設(shè)置最低cmake版本要求 cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR) #支持 pkg-config include(FindPkgConfig) #檢查 libcurl cairo 等模塊, 并獲取它們的LIBS和INCLUDE, 結(jié)果保存到變量 LB_LIBS_XXX 中 # LB_LIBS_INCLUDE_DIRS # 保存包含路徑 # LB_LIBS_LIBRARIES # 保存連接庫(kù) pkg_check_modules(LB_LIBS REQUIRED libcurl cairo)# 設(shè)置項(xiàng)目名稱 project(myproject) # 檢查編譯目錄和源碼是否為同一目錄, 如果是則提示錯(cuò)誤 if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")message(FATAL_ERROR "Do not build in-source.\nPlease remove CMakeCache.txt and the CMakeFiles/ directory.\nThen: mkdir build ; cd build ; cmake .. ; make") endif()if( CMAKE_BUILD_TYPE STREQUAL "Release" )add_definitions(-DNODEBUG) else()add_definitions(-DDEBUG)#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -O0 -ggdb")#set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -ggdb")#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -O0 -ggdb")#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ggdb") endif()set(CMAKE_CXX_STANDARD 11)# 設(shè)置變量 PROJECT_NAME 并初始化, 使用 ${XXX} 引用, 如: ${PROJECT_NAME} set(PROJECT_NAME "xxx")add_definitions(-DDEBUG) # 添加宏定義# 設(shè)置CMAKE_C_FLAGS, `${CMAKE_C_FLAGS}` 可取出CMAKE_C_FLAGS的值 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb") # 添加include目錄(-l) include_directories(src) include_directories(include) # 設(shè)置 XXX_TESTS 為 OFF set(XXX_TESTS OFF CACHE BOOL "") # 添加子目錄, 子目錄要包含CMakeLists.txt文件 add_subdirectory(src) # 添加可執(zhí)行文件 example 的生成規(guī)則, 后面接依賴文件或者文件列表 add_executable(example example.c) # 設(shè)置可執(zhí)行文件 example 的鏈接庫(kù), 后面接的可以是系統(tǒng)庫(kù), 也可以是 子目錄下的自定義庫(kù) target_link_libraries(example lib) # 檢測(cè)是否配置了編譯類型[Release|Debug], 如果沒(méi)有配置則配置為Release if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE "Release" CACHE STRING"Choose the type of build, options are: Debug Profile Release Asan Ubsan." FORCE) endif(NOT CMAKE_BUILD_TYPE)子CMakeLists.txt文件
cmake_minimum_required(VERSION 2.6) # cmake 版本要求 project(lib) # 項(xiàng)目名稱# 設(shè)置option # 可以在 add_subdirectory(xxx) 時(shí)用 set(XXX OFF|ON CACHE BOOL "") 來(lái)設(shè)置值 # 名稱 描述 默認(rèn)值[ON | OFF] # option(XXX "描述 ... " ON) option(XXX_TESTS "Build xxx tests and enable testing" ON) option(XXX_STATIC "Build static library" ON) option(XXX_SHARED "Build shared library" ON)# 根據(jù) option 條件編譯 # if 語(yǔ)句 支持邏輯運(yùn)算 [AND | OR | NOT] ; #支持else分支: if() else() endif() if(XXX_TESTS) # TODO# enable_testing()# add_subdirectory(test testdir) endif()# 設(shè)置包含目錄( `./` 當(dāng)前目錄) include_directories(./) # 設(shè)置文件列表SRC_FILES (自定義名稱) 的文件內(nèi)容( 包含的文件 ) set(SRC_FILES arch.c base.c common.c data.c) # 添加靜態(tài)庫(kù) lib 的生成規(guī)則, 依賴 SRC_FILES add_library(lib STATIC ${SRC_FILES}) # 添加動(dòng)態(tài)態(tài)庫(kù) lib 的生成規(guī)則, 依賴 SRC_FILES add_library(lib_shared SHARED ${SRC_FILES})構(gòu)建項(xiàng)目
為了保持項(xiàng)目目錄的干凈, 我們一般會(huì)在build目錄下進(jìn)行構(gòu)建
$ mkdir build # 創(chuàng)建構(gòu)建目錄 $ cd build # 進(jìn)入構(gòu)建目錄 $ cmake .. # 從上級(jí)目錄構(gòu)建, 構(gòu)建產(chǎn)生的臨時(shí)文件和目標(biāo)文件將在當(dāng)前目錄生成 $ make # 生成目標(biāo)添加 c++11 支持
添加一個(gè)編譯器選項(xiàng)?add_compile_options(-std=c++11) # CMake 2.8.12 or newer不過(guò)這種方式不夠靈活
使用set來(lái)設(shè)置cmake內(nèi)置變量
set(CMAKE_CXX_STANDARD 11) # C++11... set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required... set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11為特定目標(biāo)進(jìn)行設(shè)置,?set_target_properties?可以為要生成的目標(biāo)設(shè)置屬性?PROPERTIES?以實(shí)現(xiàn)不同目標(biāo)的差異處理
set_target_properties(myTarget PROPERTIESCXX_STANDARD 11CXX_STANDARD_REQUIRED ONCXX_EXTENSIONS OFF )設(shè)置運(yùn)行時(shí)庫(kù)搜索路徑 (gcc -Wl,-rpath=./)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH "./")設(shè)置鏈接時(shí)庫(kù)搜索路徑 (gcc -L./)
LINK_DIRECTORIES("./lib")其他-使用自定義動(dòng)態(tài)/靜態(tài)庫(kù)
# copy local file 拷貝文件 configure_file(${CMAKE_SOURCE_DIR}/libsqlite3.so ${CMAKE_BINARY_DIR}/libsqlite3.so COPYONLY)# add local library 添加庫(kù)文件 add_library(sqlite3 SHARED IMPORTED) # or STATIC instead of SHARED# 設(shè)置庫(kù)文件屬性(文件路徑,頭文件目錄) set_target_properties(sqlite3 PROPERTIESIMPORTED_LOCATION "${CMAKE_BINARY_DIR}/libsqlite3.so"INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include")# 添加到鏈接目標(biāo) target_link_libraries(<TARGET> sqlite3)使用自定義命令
# 添加命令, OUTPUT 輸出, COMMAND 命令 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/message.proto3.pb.ccCOMMAND ${PROTOC} --cpp_out=${CMAKE_BINARY_DIR} --proto_path=${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/message.proto3 ) # 添加到 OUTPUT 到 SRCS 變量中 (OUTPUT必須被依賴,否則不會(huì)執(zhí)行命令) List (APPEND SRCS ${CMAKE_BINARY_DIR}/message.proto3.pb.cc)包含cmake格式的配置文件
include(xxxx.cmake)包含子工程
# 添加子目錄, 子目錄要包含CMakeLists.txt文件 add_subdirectory(subdir)OS define
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")set(WINDOWS TRUE)message(WARNING "only for Windows") else()set(LINUX TRUE)message(WARNING "only for linux") endif()cross build
if(BUILD_FOR_ARM)SET(CROSS_TOOLS_PATH /opt/crosstools/arm-2009q3/bin/arm-none-linux-gnueabi)SET(CROSS_ROOT_PATH /opt/crosstools/sys-root)# this one is importantSET(CMAKE_SYSTEM_NAME Linux)#this one not so muchSET(CMAKE_SYSTEM_VERSION 1)# specify the cross compilerSET(CMAKE_C_COMPILER ${CROSS_TOOLS_PATH}-gcc)SET(CMAKE_CXX_COMPILER ${CROSS_TOOLS_PATH}-g++)# where is the target environmentSET(CMAKE_FIND_ROOT_PATH ${CROSS_ROOT_PATH})# search for programs in the build host directoriesSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)# for libraries and headers in the target directoriesSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) endif()使用文件配置交叉編譯工具鏈
# 文件 arm-none-linux-gnueabi-gcc.cmake SET(CROSS_TOOLS_PATH /opt/crosstools/arm-2009q3/bin/arm-none-linux-gnueabi) SET(CROSS_ROOT_PATH /opt/crosstools/sys-root)# this one is important SET(CMAKE_SYSTEM_NAME Linux) #this one not so much SET(CMAKE_SYSTEM_VERSION 1)# specify the cross compiler SET(CMAKE_C_COMPILER ${CROSS_TOOLS_PATH}-gcc) SET(CMAKE_CXX_COMPILER ${CROSS_TOOLS_PATH}-g++)# where is the target environment SET(CMAKE_FIND_ROOT_PATH ${CROSS_ROOT_PATH})# search for programs in the build host directories SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 使用交叉工具鏈編譯工程 mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=../arm-none-linux-gnueabi-gcc.cmake ..總結(jié)
以上是生活随笔為你收集整理的cmake 入门学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux(Ubuntu)下嵌入式gdb
- 下一篇: Vysor 破解