php网站项目,广西智能网站建设方案,国色天香站长工具,wordpress蜘蛛插件一、版本要求#xff1a;
检查 cmake 版本号的最低要求#xff0c;不满足条件时报错。
cmake_minimum_required(VERSION version)参数#xff1a;
version#xff1a;最低要求的版本号 例子#xff1a;
# 最低要求安装3.21版本的cmake
cmake_minimum_required…一、版本要求
检查 cmake 版本号的最低要求不满足条件时报错。
cmake_minimum_required(VERSION version)参数
version最低要求的版本号 例子
# 最低要求安装3.21版本的cmake
cmake_minimum_required(VERSION 3.21)二、工程名称
设置项目的工程名称此名称设置后可以使用 CMAKE_PROJECT_NAME 宏直接获取
project(name [language])参数
name项目名称language指定项目的编程语言例如C、CXX、ASM 例子
# 指定项目使用 C、C或者是汇编
set(BUILD_TARGET main)
project(${BUILD_TARGET} C CXX ASM)三、添加构建目录
增加 cmake 子目录用于建立 Cmakelists.txt 文件层级的依赖
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])参数
source_dir该参数指定一个子目录子目录下应该包含 CMakeLists.txt 文件和代码文件binary_dir指定输出目录如果没有指定默认生成到 source_dir 目录 例子
# 指定 cmake 子目录
add_subdirectory(deps/)四、添加宏定义(-Dxxx)
为编译目标或者所有目标增加宏定义
# 为当前路径的所有源文件和target增加编译定义
# 方式1
add_definitions(-DFOO -DBAR ...)
# 方式2
add_compile_definitions(definition ...)# 为指定的target指定宏定义
target_compile_definitions(targetINTERFACE|PUBLIC|PRIVATE [definition1...][INTERFACE|PUBLIC|PRIVATE [definition2...] ...])参数
target宏定义所属的目标可以有 add_executable() 或 add_library() 定义definition指定的宏定义不需要带 -D 例子
add_definitions(-DFOO1 -DBAR)add_compile_definitions(FOO1 BAR)target_compile_definitions(target PRIVATE FOO1 PUBLIC BAR)target_compile_definitions 可以指定目标进行宏定义例如代码中有宏进行隔离的部分可以通过为 target 指定不同的宏配合 add_library() 来生成不同的库文件。
五、生成可执行文件
增加一个目标用于生成可执行文件
add_executable(target [EXCLUDE_FROM_ALL] [source1] [source2 ...])参数
target可执行目标的名称EXCLUDE_FROM_ALL当使用这个选项时指定的文件将不参与构建source源文件列表也可以通过 target_sources() 为可执行目标文件添加源文件要求是在调用 target_sources 之前可执行目标文件必须已经通过 add_executable() 或 add_library() 定义了。 例子
# 直接指定源文件
add_executable(main main.c)# 通过 target_sources 追加源文件
add_executable(main)
target_sources(main PUBLIC main.c other.c)六、生成库文件
普通库生成
生成普通的静态库或者是动态库文件
add_library(name [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source...])参数
name库的名称STATIC|SHARED|MOUDLE库的类型source构建库的文件也可以通过 target_sources() 继续为可执行目标文件添加源文件 例子
# 生成静态库
add_library(main STATIC ${libs_src})# 生成动态库
add_library(list SHARED ${libs_src})对象库生成
只编译但是不会进行库的打包
add_library(name OBJECT [source...])只编译 source 列表的文件但不将生成的目标文件打包为库而是在其他 add_library() 或者 add_executable() 生成目标的时候可以使用形如$TARGET_OBJECTS:objlib的表达式将对象库作为源引入。 参数
name库的名称OBJECT库的类型source构建库的文件也可以通过target_sources()继续为可执行目标文件添加源文件 例子
add_library(list OBJECT ./list.c)
add_library(mylist $TARGET_OBJECTS:list)七、指定头文件目录(gcc -I):
为所有目标或者指定的目标增加头文件搜索路径
# 为所有target 添加头文件路径
include_directories([AFTER|BEFORE] dir1 [dir2 ...])# 为指定目标添加头文件路径
target_include_directories(target [SYSTEM] [AFTER|BEFORE]INTERFACE|PUBLIC|PRIVATE [dir1...][INTERFACE|PUBLIC|PRIVATE [dir1...] ...])include_directories 会为当前 CMakeLists.txt 的所有目标以及之后添加的所有子目录的目标添加头文件搜索路径。 参数
AFTER、BEFORE指定的路径添加到搜索列表前面还是后面默认 AFTERdir指定要搜索的头文件目录目录是当前源码路径(当前 CMakeLists.txt)的相对路径;target: 要添加头文件的目标target由 add_library 和 add_executable 添加;dir 指定的源文件或者头文件地址是相对于 CMAKE_CURRENT_SOURCE_DIR 的地址 例子
include_directories(${CMAKE_SOURCE_DIR}/include)target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)八、收集源文件:
收集指定目录下的源文件
aux_source_directory(dir variable)参数
dir指定的目录variable把源文件列表保存到指定的变量中 例子
aux_source_directory(../src LOCAL_SRC)
# 排除 src 路径下的 test.c 文件
list(REMOVE_ITEM LOCAL_SRC ../src/test.c)# 使用 file 收集源文件
file(GLOB LOCAL_SRC src/*.c)九、指定库文件目录(gcc -L):
为所有目标或指定目标添加库文件搜索路径
link_directories(dir1 dir2 ...)# 为指定目标添加库文件搜索目录
target_link_directories(target [BEFORE]INTERFACE|PUBLIC|PRIVATE [items1...][INTERFACE|PUBLIC|PRIVATE [items2...] ...])参数
AFTER、BEFORE指定的路径添加到搜索列表前面还是后面默认AFTERdir指定要搜索的库文件目录目录是当前源码路径(当前 CMakeLists.txt)的相对路径;target: 要添加头文件的目标target 由 add_library() 和 add_executable() 添加;items 指定的源文件或者头文件地址是相对于 CMAKE_CURRENT_SOURCE_DIR 的地址 例子
link_directories(${CMAKE_SOURCE_DIR}/lib)target_link_directories(${target} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lib)如果在使用 target_link_libraries 时库已经包含了绝对路径时也可以不需要指定库的搜索路径。
十、指定库文件(gcc -l)
为目标添加链接是需要的库文件
target_link_libraries(target ... item... ...) # link_libraries 已经弃用参数
target: 要增加的目标必须先通过 或 指定item依赖的的库名称 例子
# 三种写法功能相同在使用前必须通过命令指定 target
target_link_libraries(main -Wl,--start-group eng mx -Wl,--end-group)target_link_libraries(main -Wl,--start-group -leng -lmx -Wl,--end-group)target_link_libraries(main -Wl,--start-group libeng.so libmx.so -Wl,--end-group)十一、增加编译选项
增加编译选项
add_compile_options(option ...)参数
option编译选项 例子
# 增加针对所有编译器的选项
add_compile_options(-g -Os
-Wall
-Wno-unused-variable
-fno-strict-aliasing
-ffunction-sections -fdata-sections
)# 增加针对指定编译器的选项
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -stdgnu11)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -stdc11 -fno-exceptions -fno-rtti -fno-threadsafe-statics)add_compile_options 是为所有编译器增加链接选项但是有些选项需要区分编译器例如 c 和 c 中特有的选项则需要使用set 设置指定的宏。
十二、增加链接选项
增加链接选项
add_link_options(option ...)参数
option链接选项 例子
add_link_options(-Wl,-Map${PROJECT_NAME}.map
-Wl,--gc-sections
)十三、定义全局属性
有些时候需要在 cmake 多个层级之间传递内容则可以使用自定义的全局属性
# 定义 MY_LIBRARIES 用于收集所有的打包后库文件
function(add_globle_libraries)
get_property(TIDE_LIBRARIES GLOBAL PROPERTY MY_LIBRARIES)
set_property(GLOBAL PROPERTY MY_LIBRARIES ${MY_LIBRARIES} ${ARGN})
endfunction()# 获取 MY_LIBRARIES 中库文件列表
get_property(MY_LIBRARIES GLOBAL PROPERTY MY_LIBRARIES)十四、执行命令
用来在 cmake 中执行命令或是调用其他程序
execute_process(COMMAND cmd1 [arguments]
[COMMAND cmd2 [arguments]]...
[WORKING_DIRECTORY directory]
[TIMEOUT seconds]
[RESULT_VARIABLE variable]
[RESULTS_VARIABLE variable]
[OUTPUT_VARIABLE variable]
[ERROR_VARIABLE variable]
[INPUT_FILE file]
[OUTPUT_FILE file]
[ERROR_FILE file]
[OUTPUT_QUIET]
[ERROR_QUIET]
[COMMAND_ECHO where]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
[ENCODING name]
[ECHO_OUTPUT_VARIABLE]
[ECHO_ERROR_VARIABLE]
[COMMAND_ERROR_IS_FATAL ANY|LAST])命令 COMMAND 会并行执行每个子进程的标准输出映射到下一个进程的标准输入上所有进程共用 standard error 管道。 参数
COMMAND: 子进程的命令行直接使用操作系统api执行WORKING_DIRECTORY在指定的目录下执行 COMMAND 命令TIMEOUT超时时间RESULT_VARIABLE最后一个子进程的返回值正常是0异常是其他整数OUTPUT_VARIABLE对应于standard output的内容ERROR_VARIABLE对应于standard error的内容OUTPUT_STRIP_TRAILING_WHITESPACE/ERROR_STRIP_TRAILING_WHITESPACE删除空白字符 例子
# 执行 echo 命令
execute_process(COMMAND echo hello worldWORKING_DIRECTORY ${PROJECT_SOURCE_DIR}TIMEOUT 3RESULT_VARIABLE result_varOUTPUT_VARIABLE output_varERROR_VARIABLE error_varOUTPUT_STRIP_TRAILING_WHITESPACEERROR_STRIP_TRAILING_WHITESPACE)
message(STATUS result: ${result_var})
message(STATUS output: ${output_var})
message(STATUS error: ${error_var})# 获取当前环境下 gcc 中 libgcc.a 的完整路径
execute_process(COMMAND gcc --print-file-name libgcc.aOUTPUT_VARIABLE TIDE_LIBGCC_FILEOUTPUT_STRIP_TRAILING_WHITESPACE)十五、定制化构建规则
add_custom_target: 添加一个伪目标没有输出的目标主要是通过依赖中的命令和依赖的依赖来进行相关动作一般配合 add_custom_command 使用通过 add_custom_command 的 OUTPUT 来作为 DEPENDS 依赖。
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[JOB_POOL job_pool]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCES src1 [src2...]])参数
Nametarget 目标名称ALL说明该目标需要添加到默认目标的构建中所以命令每次都会被执行COMMAND构建时执行的命令COMMENT注释信息会在命令执行前打印出来DEPENDS通常以同一 CMakeLists.txt 文件中的 add_custom_command() 命令生成的文件作为依赖 例子
# 例子中通过 add_custom_target 设置一个没有输出的目标通过目标的依赖来创建一个名称为 log.txt 的文件set(TEST_FILE log.txt)
# 产生 FILE_TEST 文件FILE_TEST 文件通过命令 copy 产生并依赖 CMAKE_CURRENT_LIST_FILE
add_custom_command(OUTPUT ${TEST_FILE}COMMAND echo Generating log.txt file...COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_FILE} ${TEST_FILE}DEPENDS ${CMAKE_CURRENT_LIST_FILE}COMMENT This is a test)# 创建一个伪目标 Test这个伪目标依赖 TEST_FILE 文件
add_custom_target(TestALLCOMMAND echo execute a custom target...DEPENDS ${TEST_FILE})add_custom_target 的最大作用就是通过一个虚拟的 target 形成依赖关系依赖关系可以无限例如依赖1–依赖2–依赖3从而形成一系列的串行动作来产生输出。
add_custom_command: 用法一生成文件 增加一个定制化的命令用来产生一个输出这个输出一般被 add_custom_target 作为 DEPENDS 依赖。
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1[ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS[depends...]]
[IMPLICIT_DEPENDSlang1 depend1 ...]
[WORKING_DIRECTORYdir]
[COMMENT comment] [VERBATIM] [APPEND])参数
OUTPUT指定输出(一般是一个中间文件)COMMAND产生输出时执行的命令COMMENT注释信息会在命令执行前打印出来DEPENDS命令执行的依赖依赖发生修改就会执行 COMMAND 产生新的 OUTPUT。依赖可以是某个 target(通过add_library/add_executable/add_custom_target创建的)或者直接是某个文件 例子
# 例子中通过 add_custom_target 设置一个没有输出的目标通过目标的依赖来创建一个名称为 log.txt 的文件set(TEST_FILE log.txt)
# 产生 FILE_TEST 文件FILE_TEST 文件通过命令 copy 产生并依赖 CMAKE_CURRENT_LIST_FILE
add_custom_command(OUTPUT ${TEST_FILE}COMMAND echo Generating log.txt file...COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_FILE} ${TEST_FILE}DEPENDS ${CMAKE_CURRENT_LIST_FILE}COMMENT This is a test)# 创建一个伪目标 Test这个伪目标依赖 TEST_FILE 文件
add_custom_target(TestALLCOMMAND echo execute a custom target...DEPENDS ${TEST_FILE})注意 add_custom_command 的 makefile 的表现形式如下就是检查依赖在依赖变动的情况下通过命令生成输出。
OUTPUT: MAIN_DEPENDENCY DEPENDSCOMMANDadd_custom_command(OUTPUT xxx) 不能单独使用否则命令将不会被执行所以他所产生的 OUTPUT 输出必须要被作为其他目标的依赖这也是为什么必须要和 add_custom_target 配合的原因。
用法二添加命令 为某个目标如库或可执行程序添加一个命令并可以指明命令执行的时机如果该目标已经构建命令将不会执行。
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK| POST_BUILD
COMMAND command1[ARGS] [args1...]
[COMMAND command2[ARGS] [args2...] ...]
[WORKING_DIRECTORYdir]
[COMMENT comment][VERBATIM])参数
TARGET指定要为那个 target 创建命令PRE_BUILD在所有规则执行前执行PRE_LINK在源文件编译后且链接前执行POST_BUILD在所有规则执行后执行命令COMMAND需要执行的命令COMMENT注释信息会在命令执行前打印出来 例子
set(TEST_FILE log.txt)# 作为依赖产生文件
add_custom_command(OUTPUT ${TEST_FILE}
COMMAND echo Generating log.txt file...
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_FILE} ${TEST_FILE}
DEPENDS ${CMAKE_CURRENT_LIST_FILE}
COMMENT This is a test
)# 创建一个没有输出的目标注意是通过依赖来执行命令
add_custom_target(Test1
ALL
COMMAND pwd
DEPENDS ${TEST_FILE})# 为目标 Test1 增加一条定制化命令
add_custom_command(TARGET Test1
PRE_BUILD
COMMAND echo executing a fake command
COMMENT This command will be executed before building target Test1
)十六、设置库输出路径
# 设置静态库文件目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)# 动态库文件目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)# 可执行文件目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)十七、文件操作
file(CMD filename [...])https://cmake.org/cmake/help/latest/command/file.html 参数
CMD文件操作命令包括读、写、增、删、改等具体参数见链接下的具体 CMDfilename文件名称 例子
# 拷贝文件
file(COPY_FILE ./test.txt ./test2.txt)十八、程序查找
find_program (VARname | NAMES name1 [name2 ...] [NAMES_PER_DIR][HINTS [path | ENV var]... ][PATHS [path | ENV var]... ][REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)][PATH_SUFFIXES suffix1 [suffix2 ...]][DOC cache documentation string][NO_CACHE][REQUIRED][NO_DEFAULT_PATH][NO_PACKAGE_ROOT_PATH][NO_CMAKE_PATH][NO_CMAKE_ENVIRONMENT_PATH][NO_SYSTEM_ENVIRONMENT_PATH][NO_CMAKE_SYSTEM_PATH][NO_CMAKE_INSTALL_PREFIX][CMAKE_FIND_ROOT_PATH_BOTH |ONLY_CMAKE_FIND_ROOT_PATH |NO_CMAKE_FIND_ROOT_PATH]
)参数
VAR寻找程序或者变量后结果的缓存NAMES除了name 以外可以指定更多可能得名称HINTS除了系统路径外还需要搜索的路径先搜索指定路径后搜索系统路径PATHS除了系统路径外还需要搜索的路径先搜索系统路径后搜索指定路径REGISTRY_VIEW指定必须要查询的注册表视图仅用于windows例如查找安装的一些软件路径REQUIRED搜索不到会报错并停止搜索NO_DEFAULT_PATH默认搜索路径将失效只会搜索PATHS和HINTS指定的路径 例子
# 搜索指定前缀的 gcc 程序
find_program(TIDE_C_COMPILER ${CROSS_COMPILE}gcc REQUIRED)# 搜索window下cmd 控制台程序
find_program(MY_PROGRAM cmd NAMES cmd.exe)十九、目标属性设置
set_target_properties(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)参数
target需要设置属性的目标在使用前 target 需要使用 add_library()或者 add_executable() 指定atrget。PROPERTIES属性标识后面紧接着时属性和属性值prop属性标识value属性值 例子
# 对目标设置宏定义
set(BUILD_FLAGS -DBUILD_DLL )
set_target_properties(main PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})# 更改目标输出名称
add_library (libiwasm SHARED ${WAMR_RUNTIME_LIB_SOURCE})
set_target_properties (libiwasm PROPERTIES OUTPUT_NAME iwasm)# 设置目标文件输出目录
set_target_properties(iwasm PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build/lib
)# 设置 include 目录搜索目录
set_target_properties(iwasm PROPERTIES INCLUDE_DIRECTORIES ${LIB_RATS_DIR})# 设置debug模式目标后缀
set_target_properties(iwasm PROPERTIES DEBUG_POSTFIX dbg)# 设置生成地址无关码的可执行目标或者库目标
set_target_properties(wamrc PROPERTIES POSITION_INDEPENDENT_CODE ON)# 自定义目标属性
set_target_properties(target PROPERTIES custom_property_name value)二十、获取目标属性
get_target_property(variable targetproperty)参数
variable存储属性的变量target获取属性的目标property属性标识 例子
# 获取 debug 目标文件的后缀名
get_target_property(postfix iwasm DEBUG_POSTFIX)路西法 的个人博客拥有更多美文等你来读