更新或安装CMake
sudo add-apt-repository ppa:george-edison55/cmake-3.x
sudo apt-get update
sudo apt-get install cmake
样例
更多变量查询地址
无感的命令
# project的名称
project (Caffe_Framework)
# 最低版本限制
cmake_minimum_required (VERSION 3.0)
# 获取`CMakeList.txt`所在目录
set(ProjDIR ${CMAKE_CURRENT_LIST_DIR})
设置一些开关或者变量
常用
+ set(a "hello")
该命令不会重写cache中的值
+ set(a "hello" CACHE)
如果cache存在该变量,使用cache中变量
如果cache中不存在,将该值写入cache
note: 仿佛CMAKE_开头的变量都会自带一个空的”“CACHE, 例如如果通过这条命令给CMAKE_BUILD_TYPE赋值,可能不会改变它的值,它仍然会用最开始的空CACHE.
+ set(a "hello" CACHE FORCE)
不论cache中是否存在,始终使用该值
# 显示所有编译命令
set(CMAKE_VERBOSE_MAKEFILE on)
# 安装路径前缀,之后的`install()`命令都安装在该路径下
set(CMAKE_INSTALL_PREFIX "~/build" CACHE PATH "" FORCE)
# 在执行cmake的目录生成一个lib文件夹,之后生成的lib会放在此文件夹下
set(LIBRARY_OUTPUT_PATH ./lib)
IF(CMAKE_BUILD_TYPE STREQUAL "")
SET(CMAKE_BUILD_TYPE Release CACHE STRING "default to Release" FORCE)
ENDIF()
编译命令
# 选择一个目录下的所有源代码
aux_source_directory(./src/ SRC_FILES_1)
# 选择另一个目录下的所有源代码
aux_source_directory(./src/math SRC_FILES_2)
# 为visual studio的源码设置文件结构(不设置的话所有源码都在一个目录)
source_group(src FILES ${SRC_FILES_1})
source_group(src\\math FILES ${SRC_FILES_2})
# 指定头文件路径,类似 -I
include_directories(./include ./)
# 指定库文件路径,类似 -L
LINK_DIRECTORIES(./lib ${a}/lib)
# 添加静态库
add_library(libname ${SRC_FILES_1} ${SRC_FILES_2})
# 为某目标添加依赖库
TARGET_LINK_LIBRARIES(libname lib1 -Wl,--whole-archive -lcnn -Wl,--no-whole-archive lib2)
# 设置安装路径
SET(CMAKE_INSTALL_PREFIX /usr/local)
# 安装至CMAKE_INSTALL_PREFIX下的目录
install(TARGETS libname ARCHIVE DESTINATION lib )
install(DIRECTORY include/ DESTINATION include FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp")
# 分支判断。字符串判断必须用STREQUAL。EQUAL用于判断number
IF(str STREQUAL "hello")
ENDIF()
# 添加子目录,EXCLUDE_FROM_ALL表示不会自动编译子目录
ADD_SUBDIRECTORY(./demo EXCLUDE_FROM_ALL)
# 添加依赖
ADD_DEPENDENCIES(target-name depend-target1 depend-target2 .. )
奇技淫巧
搜索所有源代码,删除指定的一个
file(GLOB_RECURSE PROJ_CPP_SOURCES
${ProjDIR}/include/*.h
${ProjDIR}/include/*.hpp
${ProjDIR}/src/*.h
${ProjDIR}/src/*.hpp
${ProjDIR}/src/*.cpp
${ProjDIR}/src/*.cc
)
source_group_by_dir( PROJ_CPP_SOURCES ProjDIR )
IF(DEL_ONE)
LIST( REMOVE_ITEM PROJ_CPP_SOURCES ${ProjDIR}/src/lucky_one.cpp)
ENDIF()
为Visual Studio配置
#Debug Release 使用不同配置
TARGET_LINK_LIBRARIES( faceDetction
$<$<CONFIG:Debug>:opencv_core2411d>
$<$<CONFIG:Release>:opencv_core2411>
$<$<CONFIG:Debug>:opencv_imgproc2411d>
$<$<CONFIG:Release>:opencv_imgproc2411>
$<$<CONFIG:Debug>:opencv_highgui2411d>
$<$<CONFIG:Release>:opencv_highgui2411>
otherlibs
)
Split File into lines
file(READ "./.git/logs/HEAD" GIT_LOGS)
STRING(REGEX REPLACE ";" "\\\\;" GIT_LOGS "${GIT_LOGS}")
STRING(REGEX REPLACE "'" "-" GIT_LOGS "${GIT_LOGS}")
STRING(REGEX REPLACE "\n" ";" GIT_LOGS "${GIT_LOGS}")
# get the last line
LIST(REVERSE GIT_LOGS )
LIST(GET GIT_LOGS 1 GIT_LOGS)
debug后缀
set_target_properties(target PROPERTIES DEBUG_POSTFIX _d)
下拉选框
set(__core_names "FastCNN" "NvCaffe" "BaseForwardCNN")
set(__core_name_default "FastCNN")
set(TOPNI_CORE_NAME ${__core_name_default} CACHE STRING "Select core architecture.")
set_property( CACHE TOPNI_CORE_NAME PROPERTY STRINGS "" ${__core_names} )