CMake 入門
CMake通過CMakeLists.txt生成makefile,對於含有大量文件的工程編譯十分方便。
指令 | 解釋 | 例 |
---|---|---|
PROJECT | 設定工程名(可與生成目標名不同),該指令隱式定義了_BINARY_DIR和_SOURCE_DIR | PROJECT(helloworld) |
SET | 設置變量 | SET(SRC_LIST main.c fun.c) |
MESSAGE | 打印消息 | MESSAGE(STATUS/SEDN_ERROR/FATAL_ERROR “todisplay” ) |
ADD_EXEUTABLE | 生成目標文件 | ADD_EXEUTABLE(your_exe main.c fun.c) |
ADD_LIBRARY | 生成動態庫或靜態庫 | ADD_LIBRARY(your_lib_name STATIC/SHARED> ) |
SET_TARGET_PROPERTIES | 可用於同時生成.so和.lib,設置.so的版本號和api號 | NA |
ADD_SUBDIRECTORY | 添加包含源文件的子目錄 | NA |
TARGET_LINK_LIBRARIES | 鏈接需要的library | TARGET_LINK_LIBRARIES(project_name lib***.so/*) TARGET_LINK_LIBRARIES(project_name ${GTEST_LIBRARY}) |
LINK_DIRECTORIES | 添加非標準的庫搜索庫搜索路徑 | NA |
INCLUDE_DIRECTORIES | 添加頭文件搜索路徑 | (BEFORE {OpenCV_INCLUDE_DIRS}) BEFORE 添加的頭文件搜索路徑在默認路徑的前面,反之AFTER |
INSTALL | 可以用於安裝生成的可執行文件 .so .lib 和 .sh以及一般文件 | NA |
常見錯誤:
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
誤用 LIBRARY_OUTPUT_DIRECTORY是無法設置輸出路徑的。 CMakeLists.txt 錯誤 寫的.c文件,C++頭文件make找不到,改成.cpp或cc
mkdir Project
cd Project
gedit CMakeLists.txt
mkdir src
cd src
touch main.c
vi main.c
:qw
mkdir build
cd build
gedit CMakeLists.txt
#CMAKE 常用外部構建,out-of-source, 舉個例子,將構建過程放到build, 在buil的目錄下 cmake ..
cmake ..
make -j
CMake進階
Cross Compile
It is effective to have a cross compiling when debugging
Host PC: x86
Target: TX2 aarch64
sudo apt-get install g++-4.9-aarch64-linux-gnu
#Point out the target
set(CMAKE_SYSTEM_NAME Linux)
#Specify the cross compiler
#set(CMAKE_CXX_COMPILER /path/to/compiler)
set(CAME_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
# Just make sure you set the CMAKE_FIND_ROOT_PATH variable to a path where you have #an exact copy of the root filesystem you have on your target device (with libraries and binaries #pre-compiled for the target processor).
set(CMAKE_FIND_ROOT_PATH /path/to/copied root filesysem of target)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM sets the default behaviour for the FIND_PROGRAM() command. It can be set to NEVER, ONLY or BOTH (default). If set to NEVER, CMAKE_FIND_ROOT_PATH will not be used for FIND_PROGRAM() calls (except where it is enabled explicitely). If set to ONLY, only the search directories with the prefixes coming from CMAKE_FIND_ROOT_PATH will be used in FIND_PROGRAM(). The default is BOTH, which means that at first the prefixed directories and after that the unprefixed directories will be searched. In most cases FIND_PROGRAM() is used to search for an executable which will then be executed e.g. using EXECUTE_PROCESS() or ADD_CUSTOM_COMMAND(). So in most cases an executable from the build host is required, so usually set CMAKE_FIND_ROOT_PATH_MODE_PROGRAM to NEVER.
You can make above file to ba X.cmake, and use CMAKE_TOOLCHAIN_FILE
cd build
cmake -DCMAKE_TOOLCHAIN_FILE = ~/X.cmake ..