cmake 入门学习
生活随笔
收集整理的這篇文章主要介紹了
cmake 入门学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://alenstar.github.io/post/cmake_template/
?
首先我們來看看我們的工程目錄結構
$ 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文件分析
# 設置最低cmake版本要求 cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR) #支持 pkg-config include(FindPkgConfig) #檢查 libcurl cairo 等模塊, 并獲取它們的LIBS和INCLUDE, 結果保存到變量 LB_LIBS_XXX 中 # LB_LIBS_INCLUDE_DIRS # 保存包含路徑 # LB_LIBS_LIBRARIES # 保存連接庫 pkg_check_modules(LB_LIBS REQUIRED libcurl cairo)# 設置項目名稱 project(myproject) # 檢查編譯目錄和源碼是否為同一目錄, 如果是則提示錯誤 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)# 設置變量 PROJECT_NAME 并初始化, 使用 ${XXX} 引用, 如: ${PROJECT_NAME} set(PROJECT_NAME "xxx")add_definitions(-DDEBUG) # 添加宏定義# 設置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) # 設置 XXX_TESTS 為 OFF set(XXX_TESTS OFF CACHE BOOL "") # 添加子目錄, 子目錄要包含CMakeLists.txt文件 add_subdirectory(src) # 添加可執行文件 example 的生成規則, 后面接依賴文件或者文件列表 add_executable(example example.c) # 設置可執行文件 example 的鏈接庫, 后面接的可以是系統庫, 也可以是 子目錄下的自定義庫 target_link_libraries(example lib) # 檢測是否配置了編譯類型[Release|Debug], 如果沒有配置則配置為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) # 項目名稱# 設置option # 可以在 add_subdirectory(xxx) 時用 set(XXX OFF|ON CACHE BOOL "") 來設置值 # 名稱 描述 默認值[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)# 根據 option 條件編譯 # if 語句 支持邏輯運算 [AND | OR | NOT] ; #支持else分支: if() else() endif() if(XXX_TESTS) # TODO# enable_testing()# add_subdirectory(test testdir) endif()# 設置包含目錄( `./` 當前目錄) include_directories(./) # 設置文件列表SRC_FILES (自定義名稱) 的文件內容( 包含的文件 ) set(SRC_FILES arch.c base.c common.c data.c) # 添加靜態庫 lib 的生成規則, 依賴 SRC_FILES add_library(lib STATIC ${SRC_FILES}) # 添加動態態庫 lib 的生成規則, 依賴 SRC_FILES add_library(lib_shared SHARED ${SRC_FILES})構建項目
為了保持項目目錄的干凈, 我們一般會在build目錄下進行構建
$ mkdir build # 創建構建目錄 $ cd build # 進入構建目錄 $ cmake .. # 從上級目錄構建, 構建產生的臨時文件和目標文件將在當前目錄生成 $ make # 生成目標添加 c++11 支持
添加一個編譯器選項?add_compile_options(-std=c++11) # CMake 2.8.12 or newer不過這種方式不夠靈活
使用set來設置cmake內置變量
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為特定目標進行設置,?set_target_properties?可以為要生成的目標設置屬性?PROPERTIES?以實現不同目標的差異處理
set_target_properties(myTarget PROPERTIESCXX_STANDARD 11CXX_STANDARD_REQUIRED ONCXX_EXTENSIONS OFF )設置運行時庫搜索路徑 (gcc -Wl,-rpath=./)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH "./")設置鏈接時庫搜索路徑 (gcc -L./)
LINK_DIRECTORIES("./lib")其他-使用自定義動態/靜態庫
# copy local file 拷貝文件 configure_file(${CMAKE_SOURCE_DIR}/libsqlite3.so ${CMAKE_BINARY_DIR}/libsqlite3.so COPYONLY)# add local library 添加庫文件 add_library(sqlite3 SHARED IMPORTED) # or STATIC instead of SHARED# 設置庫文件屬性(文件路徑,頭文件目錄) set_target_properties(sqlite3 PROPERTIESIMPORTED_LOCATION "${CMAKE_BINARY_DIR}/libsqlite3.so"INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include")# 添加到鏈接目標 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必須被依賴,否則不會執行命令) 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 ..總結
以上是生活随笔為你收集整理的cmake 入门学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux(Ubuntu)下嵌入式gdb
- 下一篇: Vysor 破解