https://blog.csdn.net/hw140701/article/details/90203141
这篇博客已经比较详细,补充几个
根据编译模式加入不同的编译选项
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native")
endif()
将文件中的内容输入到字符串
file(STRINGS myfile.txt myfile)
遍历添加子目录
FILE(GLOB ALL_SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")
FOREACH(SOURCE_DIR ${ALL_SOURCES_DIR}}
IF(IS_DIRECTORY ${SOURCE_DIR})
SUBDIRS(${SOURCE_DIR})
ENDIF()
ENDFOREACH()
递归添加头文件
function(include_sub_directories_recursively root_dir)
if (IS_DIRECTORY ${root_dir}) # 当前路径是一个目录吗,是的话就加入到包含目录
message("include dir: " ${root_dir})
include_directories(${root_dir})
endif()
file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中
foreach(sub ${ALL_SUB})
if (IS_DIRECTORY ${root_dir}/${sub})
include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含
endif()
endforeach()
endfunction()
include_sub_directories_recursively(${PROJECT_SOURCE_DIR}/include)
获取当前文件夹下的文件
FILE(GLOB FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
string 命令
string(REGEX MATCH <regular_expression>
<output variable> <input> [<input>...])
string(REGEX MATCHALL <regular_expression>
<output variable> <input> [<input>...])
string(REGEX REPLACE <regular_expression>
<replace_expression> <output variable>
<input> [<input>...])
string(REPLACE <match_string>
<replace_string> <output variable>
<input> [<input>...])
string(CONCAT <output variable> [<input>...])
string(<MD5|SHA1|SHA224|SHA256|SHA384|SHA512>
<output variable> <input>)
string(COMPARE EQUAL <string1> <string2> <output variable>)
string(COMPARE NOTEQUAL <string1> <string2> <output variable>)
string(COMPARE LESS <string1> <string2> <output variable>)
string(COMPARE GREATER <string1> <string2> <output variable>)
string(ASCII <number> [<number> ...] <output variable>)
string(CONFIGURE <string1> <output variable>
[@ONLY] [ESCAPE_QUOTES])
string(TOUPPER <string1> <output variable>)
string(TOLOWER <string1> <output variable>)
string(LENGTH <string> <output variable>)
string(SUBSTRING <string> <begin> <length> <output variable>)
string(STRIP <string> <output variable>)
string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>]
[RANDOM_SEED <seed>] <output variable>)
string(FIND <string> <substring> <output variable> [REVERSE])
string(TIMESTAMP <output variable> [<format string>] [UTC])
string(MAKE_C_IDENTIFIER <input string> <output variable>)
for example:
STRING(REGEX REPLACE ".*/(.*)/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})
MESSAGE( "Current Folder Name:" ${CURRENT_FOLDER})
将某一个工程放置于某一个文件夹下(指的是工程位于某目录)
set_property(TARGET "XXX" PROPERTY FOLDER "YYY")
add_link_library
add_link_library("NAME"
TYPE XXX
LIBRARIES XXX
PUBLIC_HEADERS XXX
SOURCE_FILES XXX
INSTALL_LIB XXX
INSTALL_HEADERS XXX)
install uninstall
INSTALL(TARGETS XXX ...
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
XXX: 当前文档中的 exe 和 lib 目标
RUNTIME 二进制可执行文件
LIBRARY 动态库
ARCHIVE 静态库
INSTALL(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
安装文件夹
INSTALL(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])
安装文件
INSTALL(PROGRAMS files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])
通过脚本安装
#INSTALL_RPATH_USE_LINK_PATH 运行目录保留链接地址 xxxx:目标名
set_target_properties(xxxx PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
--------------------华丽分界线--------------------
uninstall
CONFIGURE_FILE(
"${PROJECT_SOURCE_DIR}/cmake/templates/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
@ONLY)
ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
---cmake_uninstall.cmake.in
# -----------------------------------------------
# File that provides "make uninstall" target
# We use the file 'install_manifest.txt'
# -----------------------------------------------
IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
STRING(REGEX REPLACE "\n" ";" files "${files}")
FOREACH(file ${files})
MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
IF(EXISTS "$ENV{DESTDIR}${file}")
EXEC_PROGRAM(
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
OUTPUT_VARIABLE rm_out
RETURN_VALUE rm_retval
)
IF(NOT "${rm_retval}" STREQUAL 0)
MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
ENDIF(NOT "${rm_retval}" STREQUAL 0)
ELSE(EXISTS "$ENV{DESTDIR}${file}")
MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
ENDIF(EXISTS "$ENV{DESTDIR}${file}")
ENDFOREACH(file)
当有依赖库通过find_package冲突时(比如本地编译的opencv与ros里装的cv冲突时)
可以在 find_package之前 设置一个cv的地址,就可以优先查找本机编译的opencv
set(OpenCV_DIR /usr/local/share/OpenCV)
FIND_PATH FIND_LIBRARY
#在PATHS后路径中寻找 Geometry.h文件,找到里就给GEOS_INCLUDE_DIR赋值 否则为FALSE
FIND_PATH(GEOS_INCLUDE_DIR geos/geom/Geometry.h
PATHS
/usr/include
/usr/local/include
PATH_SUFFIXES include
)
#基本同上 查找链接库的
FIND_LIBRARY(GEOS_LIBRARY
NAMES geos
PATHS
/usr/lib
/usr/local/lib
NO_DEFAULT_PATH
PATH_SUFFIXES lib64 lib
)
在子目录中给父目标添加头文件及链接
function( target_link_LIB )
#add macros
#ARGV like main func second paramter ARGV0 1 ...
target_compile_definitions( ${ARGV0} PRIVATE WITH_LIB )
#add include
target_include_directories( ${ARGV0}
PRIVATE
${ARGV1}
)
#add library
target_link_libraries( ${ARGV0} ${ARGV1} )
endfunction()
#usage
target_link_LIB(${PROJECT_NAME} ${THIS_INCLUDE} ${THIS_LIB})
关键字
CMAKE_SHARED_MODULE_SUFFIX 平台相关模块后缀(osx/ios 后缀都是so 不是太理解 难道是因为osx基于unix的原因)
CMAKE_SHARED_LIBRARY_SUFFIX 平台相关动态库后缀(osx/ios 都是dylib 比较正常)