CMakeList 记录

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 比较正常)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值