2021年4月28日
CMake边用边学
我觉得CMake当个工具用,用到的时候边查边用,临时抱佛脚也来得及。
简单示例:
# 指定工程名
PROJECT (HELLO)
# 现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可
# 将 hello.cpp 赋值给 SRC_LIST 变量,也可以指定多个源文件,用空格隔开
# SET(SRC_LIST hello.cpp add.cpp sub.cpp)
SET(SRC_LIST hello.cpp)
# 输出打印构建目录
MESSAGE(STATUS "This is HELLO_BINARY_DIR " ${HELLO_BINARY_DIR})
# 输出打印资源目录
MESSAGE(STATUS "This is HELLO_SOURCE_DIR " ${HELLO_SOURCE_DIR})
# 输出打印资源目录,与HELLO_SOURCE_DIR 一样
MESSAGE(STATUS "This is PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
# 输出打印 CMake 资源目录,与 PROJECT_SOURCE_DIR 一样
MESSAGE(STATUS "This is CMAKE_SOURCE_DIR " ${CMAKE_SOURCE_DIR})
# 生成可执行文件 hello ,${SRC_LIST}是引用变量,也就是源文件 hello.cpp
ADD_EXECUTABLE(hello ${SRC_LIST})
- 一些参考:
- 迭代改进中:
cmake_minimum_required(VERSION 2.8.12)
project(robot)
MESSAGE(STATUS "operation system is ${CMAKE_SYSTEM}")
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
MESSAGE(STATUS "current platform: Linux ")
ADD_DEFINITIONS(-D LINUX)
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
MESSAGE(STATUS "current platform: Windows")
ELSE ()
MESSAGE(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")
add_compile_options(-w)
IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_options(-O0 -g)
ELSEIF (CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_options(-O0)
ENDIF()
MESSAGE(STATUS "current build type: ${CMAKE_BUILD_TYPE}")
file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp)
source_group("Include" FILES ${CURRENT_HEADERS})
include_directories(
.
)
link_directories(
)
FILE (GLOB ALL_SOURCES "*.cpp")
add_executable(${PROJECT_NAME} ${ALL_SOURCES} ${CURRENT_HEADERS})
target_link_libraries(${PROJECT_NAME} -lpthread)
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION .
)
- 使用方法:
mkdir build cd build cmake .. make make install
- 使用 cmake 进行交叉编译
交叉编译,主要是设置一些环境变量。这些设定可以写成一个 .cmake 文件,1) 需要交叉编译时 include ,2)或者直接把这些配置写到 CMakeLists.txt 文件的开始位置。两种方法是等效的。
CMakeLists.txt包含.cmake文件
include (cross.cmake)
或者命令行指定cmake文件:
cmake path -DCMAKE_TOOLCHAIN_FILE=./toolchain.cmake
.cmake文件示例:
# this one is important
SET(CMAKE_SYSTEM_NAME Linux)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
# specify the cross compiler
SET(TOOLCHAIN_DIR "/home/robot/tools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin")
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/arm-linux-gnueabihf-g++)
# where is the target environment
SET(CMAKE_FIND_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)