Learn CMakeLists.txt From One Project
- Description:
ThisCMakeLists.txtis from a project about Collect Data From Kinect.
This project cannot be source-open, but I show the directory structure below.
Commonly-Used Methods
cmake_minimum_required
cmake_minimum_required(VERSION 2.8)
設置最小cmake版本號。
project
project(<project_name>)
設置工程名稱,后面就可以用 ${PROJECT_NAME} 來調用。
set
舉例:
set(CMAKE_CXX_FLAGS "-std=c++11 -g")
設置 CMAKE_CXX_FLAGS,比如可以加入C++11標准和gdb調試的支持。
add_subdirectory
有多目錄時,可以先將其他目錄里的文件編譯成靜態庫再由 main 函數調用。
根目錄 CMakeLists.txt 中添加:
add_subdirectory(<sub_dir>)
<sub_dir> 不加引號。
然后子目錄 CMakeLists.txt 中使用 aux_source_dir 和 add_library,見 5 和 6。
add_library
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] [...])
ADD_LIBRARY creates an static library from the listed sources.
STATIC、SHARED和MODULE的作用是指定生成的庫文件的類型。
STATIC庫是目標文件的歸檔文件,在鏈接其它目標的時候使用。默認使用類型。SHARED庫會被動態鏈接(動態鏈接庫),在運行時會被加載。MODULE庫是一種不會被鏈接到其它目標中的插件,但是可能會在運行時使用dlopen-系列的函數。
默認狀態下,庫文件將會在於源文件目錄樹的構建目錄樹的位置被創建,該命令也會在這里被調用。
語法中的source1 source2分別表示各個源文件。
aux_source_directory
aux_source_directory(./ DIR_BPE_SRCS)
add_library(boxposeestimator ${DIR_BPE_SRCS})
查找當前目錄下的所有源文件並將名稱保存到 DIR_BPE_SRCS 變量
include_directories
指定頭文件(*.h, *.hpp)所在路徑('/path/to/include/')。
相當於 g++ -I。
add_executable
add_executable(wheel ${DIRSRCS})
將 ${DIRSRCS} 下所有的源文件編譯成一個名稱為 wheel 的可執行文件。
link_directories
主要是指定要鏈接的庫文件的路徑('/path/to/lib/'),該指令有時候不一定需要。因為find_package和find_library指令可以得到庫文件的絕對路徑。
不過自己寫的動態庫文件放在自己新建的目錄下時,可以用該指令指定該目錄的路徑以便工程能夠找到。
相當於 g++ -L。
target_link_libraries
指定要鏈接的庫文件(.so)。
相當於 g++ -l
Directory Structure
這里展示我這個工程的文件樹結構。
wheel_data_acq_loc/
├── boxposeestimator
│ ├── boxposeestimator.cpp
│ ├── boxposeestimator.h
│ ├── CMakeLists.txt
│ └── README.md
├── build
│ ├── boxposeestimator
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── wheel
├── camera3dData.cpp
├── camera3dData.h
├── camera3dDataKinectV2IRLinux.cpp
├── camera3dDataKinectV2IRLinux.h
├── CMakeLists.txt
├── ConfigCameraKinectV2.yaml
└── main_demo_Linux.cpp
有兩個 CMakeLists.txt 文件。
wheel_data_acq_loc/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(wheel)
# 設置debug模式
set(cmake_build_type debug)
# 設置支持C++11標准和支持gdb調試
set(CMAKE_CXX_FLAGS "-std=c++11 -g")
# 打印
message(STATUS "Project: WHEEL")
message(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")
find_package(OpenCV REQUIRED)
find_package(PCL REQUIRED)
find_package(freenect2 REQUIRED)
# Add the source in project root directory
#aux_source_directory(<dir> <variable>)
aux_source_directory(. DIRSRCS)
# Add header file (.h, .hpp, etc) include directories
###g++ -I### ('../include/')
include_directories(./ ./boxposeestimator)
include_directories(${OpenCV_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS} ${freenect2_INCLUDE_DIRS})
#add_definitions(${OpenCV_DEFINITIONS} ${PCL_DEFINITIONS} ${freenect2_DEFINITIONS})
# Add block directories
add_subdirectory(boxposeestimator)
# Target
add_executable(wheel ${DIRSRCS})
###g++ -L### ('../lib/')
link_directories(${OpenCV_LIBRARY_DIRS} ${PCL_LIBRARY_DIRS} ${freenect2_LIBRARY_DIRS})
###g++ -l### (.so)
target_link_libraries(wheel ${PCL_LIBRARIES}
${OpenCV_LIBS}
${freenect2_LIBRARIES}
boxposeestimator)
wheel_data_acq_loc/boxposeestimator/CMakeLists.txt
aux_sourcedirectory(. DIR_BPE_SRCS)
add_library(boxposeestimator ${DIR_BPE_SRCS})
