cmake指令

项目属性

CMAKE_VERSION

cmake_minimum_required(VERSION 3.2)
if(CMAKE_VERSION VERSION_LESS "3")
    add_definitions(-std=c++14)
else()
    # add_definitions(-std=c++14)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()

CMAKE_BUILD_TYPE

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release")
endif()
message("BUILD TYPE:" ${CMAKE_BUILD_TYPE})

第三方库

编译相关

添加g++标志位

add_definitions

if(CMAKE_VERSION VERSION_LESS "3")
    add_definitions(-std=c++14)
else()
    # add_definitions(-std=c++14)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()

添加编译选项

set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -rdynamic -O3 -fPIC -ggdb -std=c++11 -Wall -Wno-deprecated -Werror -Wno-unused-function -Wno-builtin-macro-redefined -Wno-deprecated-declarations")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
add_definitions(-fsanitize=address)
  • CMAKE_CXX_FLAGS
    这种大写的变量,一般都是CMake预定义的内建变量,且他们是全局的。该变量可用于设置编译选项。直接使用set修改其值即可。
    除了修改该变量的值之外,还可以通过add_compile_options命令来设置编译选项。它们的区别是:
    add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器)
    CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器

  • $ENV{}
    $ENV{}用于获取环境变量设置环境变量的方法是:set(ENV{变量名} 值)

  • CXXFLAGS
    CXXFLAGS是C++编译器的编译选项。

  • -rdynamic
    -rdynamic编译选项通知链接器将所有符号添加到动态符号表中。(目的是能够通过使用 dlopen 来实现向后跟踪)
    gcc选项-g与-rdynamic的异同

  • -O3
    -O3是一个优化选项,告诉编译器优化我们的代码。
    gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

  • -fPIC
    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码,即,产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
    gcc编译参数-fPIC的一些问题

  • -ggdb
    -ggdb选项使编译器生成gdb专用的更为丰富的调试信息。
    gcc 的 -g 和 -ggdb 选项

  • -std=c++11
    -std=c++11设置为使用C++11标准

  • -Wall
    -Wall选项告诉编译器 编译后显示所有警告。
    gcc中的-w -W和-Wall选项

  • -Wno-deprecated
    不要警告使用已弃用的功能

  • -Werror
    告诉编译器视所有警告为错误,出现任何警告立即放弃编译

  • -Wno-unused-function
    关闭 函数被定义了但没有被使用 而产生的警告,即,不使用的函数不警告。

  • -Wno-builtin-macro-redefined
    如果某些内置宏被重新定义,请不要警告。这抑制了警告的重新定义__TIMESTAMP__,TIME,DATE,FILE,和__BASE_FILE__。

  • -Wno-deprecated-declarations
    关闭使用废弃API的警告。

set_target_properties设置可执行文件属性

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 设置可执行文件的属性
set_target_properties(MyExecutable PROPERTIES
    OUTPUT_NAME "myapp"
    OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    COMPILE_OPTIONS "-Wall"
    LINK_OPTIONS "-L/some/path"
    INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include"
    LINK_LIBRARIES mylib
)

链接

include_directories

include_directories(${PROJECT_SOURCE_DIR})

文件

获取文件

file

file(GLOB_RECURSE CPP_SOURCES  "*.cpp") # 获取文件路径

get_filename_component

cmake(三十一)Cmake之get_filename_component指令

 get_filename_component(filename ${cpp_name} NAME_WE)    # 获取文件不含扩展名

  • DIRECTORY:文件所在目录
  • NAME:没有目录名的文件名
  • NAME_WE: 没有文件名和扩展名的文件名
  • LAST_EXT:最后一个扩展名
  • NAME_WLE:没有目录和最后一个扩展名的文件名
posted @ 2023-06-19 20:26  小小灰迪  阅读(57)  评论(0编辑  收藏  举报