cmake常用命令的一些整理

cmake常用命令的一些整理

10 人 赞同了该文章

CMake 是什么我就不用再多说什么了,相信大家都有接触才会看一篇文章。对于不太熟悉的开发人员可以把这篇文章当个查找手册。

1.CMake语法

1.1 指定cmake的最小版本

cmake_minimum_required(version 版本号)

例如:

cmake_minimum_required(version 2.8)

1.2 定义工程名称

#定义工程名称 
project(项目名称)

例如:

project(MyTest)

1.3 显示定义变量

set(var [value])

例如:

# 第一种用法,生成代码文件列表
#先直接设置SRC_LIST的值
set(SRC_LIST add.h add.cpp)
#然后再在SRC_LIST中追加main.cpp 
set(SRC_LIST ${SRC_LIST} main.cpp)

第二中用法,设置库生成目录或者可执行文件生成目录

set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/linux)
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

1.4 设置编译类型

# 编译静态库
add_library(库名称 STATIC 代码文件名称)

编译动态库

add_library(库名称 SHARED 代码文件名称)

编译可执行程序

add_executable(可执行程序名 代码文件名称)

例如:

# 编译静态库
add_library(add STATIC add.h add.cpp)
add_library(add STATIC ${ADD_SRC} ${ADD_HDR})

编译动态库

add_library(add SHARED add.h add.cpp)
add_library(add SHARED ${ADD_SRC} ${ADD_HDR})

编译可执行程序

add_executable(main add.h add.cpp mai.cpp)
add_executable(main ${MAIN_SRC} ${MAIN_HDR})

1.5 指定静态库或者动态库编译输出目录

例如将当前编译的静态库或者动态库输出到当前项目文件夹lib子目录下

set(LIBRARY_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/lib)

1.6 指定可执行程序编译输出目录

例如将当前可执行程序输出到当前项目文件夹的bin子目录下

#设定可执行二进制文件的目录
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

1.7 设置链接库搜索目录

例如将链接库搜索目录设置为当前项目文件夹下lib/linux文件夹

link_directories( 
      
      
       
        
         
          
          
            P 
           
          
            R 
           
          
            O 
           
          
            J 
           
          
            E 
           
          
            C 
           
           
           
             T 
            
           
             S 
            
           
          
            O 
           
          
            U 
           
          
            R 
           
          
            C 
           
           
           
             E 
            
           
             D 
            
           
          
            I 
           
          
            R 
           
          
         
           / 
          
         
           l 
          
         
           i 
          
         
           b 
          
         
           / 
          
         
           l 
          
         
           i 
          
         
           n 
          
         
           u 
          
         
           x 
          
         
           ) 
          
         
           < 
          
         
           / 
          
         
           c 
          
         
           o 
          
         
           d 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           / 
          
         
           p 
          
         
           r 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           / 
          
         
           d 
          
         
           i 
          
         
           v 
          
         
           > 
          
         
           < 
          
         
           h 
          
         
           3 
          
         
           > 
          
         
           1.8 
          
         
           设 
          
         
           置 
          
         
           包 
          
         
           含 
          
         
           目 
          
         
           录 
          
         
           < 
          
         
           / 
          
         
           h 
          
         
           3 
          
         
           > 
          
         
           < 
          
         
           p 
          
         
           > 
          
         
           例 
          
         
           如 
          
         
           将 
          
         
           包 
          
         
           含 
          
         
           目 
          
         
           录 
          
         
           设 
          
         
           置 
          
         
           为 
          
         
           当 
          
         
           前 
          
         
           项 
          
         
           目 
          
         
           文 
          
         
           件 
          
         
           夹 
          
         
           下 
          
         
           i 
          
         
           n 
          
         
           c 
          
         
           l 
          
         
           u 
          
         
           d 
          
         
           e 
          
         
           文 
          
         
           件 
          
         
           夹 
          
         
           < 
          
         
           / 
          
         
           p 
          
         
           > 
          
         
           < 
          
         
           d 
          
         
           i 
          
         
           v 
          
         
           c 
          
         
           l 
          
         
           a 
          
         
           s 
          
         
           s 
          
         
           = 
          
         
           " 
          
         
           h 
          
         
           i 
          
         
           g 
          
         
           h 
          
         
           l 
          
         
           i 
          
         
           g 
          
         
           h 
          
         
           t 
          
         
           " 
          
         
           > 
          
         
           < 
          
         
           p 
          
         
           r 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           c 
          
         
           o 
          
         
           d 
          
         
           e 
          
         
           c 
          
         
           l 
          
         
           a 
          
         
           s 
          
         
           s 
          
         
           = 
          
         
           " 
          
         
           l 
          
         
           a 
          
         
           n 
          
         
           g 
          
         
           u 
          
         
           a 
          
         
           g 
          
         
           e 
          
         
           − 
          
         
           t 
          
         
           e 
          
         
           x 
          
         
           t 
          
         
           " 
          
         
           > 
          
         
           i 
          
         
           n 
          
         
           c 
          
         
           l 
          
         
           u 
          
         
           d 
          
          
          
            e 
           
          
            d 
           
          
         
           i 
          
         
           r 
          
         
           e 
          
         
           c 
          
         
           t 
          
         
           o 
          
         
           r 
          
         
           i 
          
         
           e 
          
         
           s 
          
         
           ( 
          
         
        
          {PROJECT_SOURCE_DIR}/lib/linux)</code></pre></div><h3>1.8 设置包含目录</h3><p>例如将包含目录设置为当前项目文件夹下include文件夹</p><div class="highlight"><pre><code class="language-text">include_directories( 
         
       
      
      PROJECTSOURCEDIR/lib/linux)</code></pre></div><h3>1.8</h3><p>include</p><divclass="highlight"><pre><codeclass="languagetext">includedirectories({PROJECT_SOURCE_DIR}/include)

1.9 设置宏定义

#预定义宏
add_definitions(-D宏名称)

例如:

add_definitions(-DWINDOWS)
add_definitions(-DLINUX)

1.10 链接静态库

link_libraries(
静态库1
静态库2
静态库3

)

注意,link_libraries中的静态库为全路径,常与1.7 link_directories 搭配使用,例如:

lib1.a lib2.a在目录${PROJECT_SOURCE_DIR}/lib/linux下,则先设置链接目录,再链接相应的库

#设置链接目录
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)
link_libraries(
lib1.a
lib2.a
)

1.11 链接动态库

target_link_libraries(所需生成的文件名称 所需链接的动态库名称)

例如

target_link_libraries(main dl)

1.12 link_libraries 和 target_link_libraries 区别

在cmake语法中,link_libraries和target_link_libraries是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别:

(1) link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
(2) link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库

1.13 file语法

1.13.1 将文件夹所有的类型的文件添加到文件列表

例如将当前文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹下所有.h加入到MAIN_HDR中。

file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/
.h)

例如将当前文件夹子目录src文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹子目录src文件夹下所有.h加入到MAIN_HDR中。

file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/src/
.h)

1.13.2 递归搜索该文件夹,将文件夹下(包含子目录)符合类型的文件添加到文件列表

例如将当前文件夹下(包括子目录下)所有.cpp文件的文件名加入到MAIN_SRC中,所有.h加入到MAIN_HDR中

file(GLOB_RECURSE MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/.cpp)
file(GLOB_RECURSE MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/
.h)

1.14 List操作

常见的List操作包括:

list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> …]
<output variable>)
list(APPEND <list> [<element> …])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> …])
list(REMOVE_ITEM <list> <value> [<value> …])
list(REMOVE_AT <list> <index> [<index> …])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

1.14.1 List移除指定项

例如从MAIN_SRC移除指定项

list(REMOVE_ITEM MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/add.cpp)

1.14.2 将两个List链接起来

# 搜索当前目录
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/
.h)

递归搜索当前目录下src子目录

file(GLOB_RECURSE MAIN_SRC_ELSE ${CMAKE_CURRENT_SOURCE_DIR}/src/.cpp)
file(GLOB_RECURSE MAIN_HDR_ELSE ${CMAKE_CURRENT_SOURCE_DIR}/src/
.h)

将MAIN_SRC_ELSE中的值添加到MAIN_SRC

将MAIN_HDR_ELSE中的值添加到MAIN_HDR

list(APPEND MAIN_SRC ${MAIN_SRC_ELSE})
list(APPEND MAIN_HDR ${MAIN_HDR_ELSE})

1.15 添加子文件夹

例如

add_subdirectory(src)

该语句会在执行完当前文件夹CMakeLists.txt之后执行src子目录下的CMakeLists.txt

1.16 message输出消息机制

输出正常:

message(STATUS “Enter cmake ${CMAKE_CURRENT_LIST_DIR}”)

输出警告

message(WARNING “Enter cmake ${CMAKE_CURRENT_LIST_DIR}”)

输出错误:

message(FATAL_ERROR "Enter cmake 
      
      
       
        
         
          
          
            C 
           
          
            M 
           
          
            A 
           
          
            K 
           
           
           
             E 
            
           
             C 
            
           
          
            U 
           
          
            R 
           
          
            R 
           
          
            E 
           
          
            N 
           
           
           
             T 
            
           
             L 
            
           
          
            I 
           
          
            S 
           
           
           
             T 
            
           
             D 
            
           
          
            I 
           
          
            R 
           
          
         
           " 
          
         
           ) 
          
         
           < 
          
         
           / 
          
         
           c 
          
         
           o 
          
         
           d 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           / 
          
         
           p 
          
         
           r 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           / 
          
         
           d 
          
         
           i 
          
         
           v 
          
         
           > 
          
         
           < 
          
         
           h 
          
         
           3 
          
         
           > 
          
         
           1.17 
          
         
           安 
          
         
           装 
          
         
           < 
          
         
           / 
          
         
           h 
          
         
           3 
          
         
           > 
          
         
           < 
          
         
           p 
          
         
           > 
          
         
           i 
          
         
           n 
          
         
           s 
          
         
           t 
          
         
           a 
          
         
           l 
          
         
           l 
          
         
           指 
          
         
           令 
          
         
           用 
          
         
           于 
          
         
           定 
          
         
           义 
          
         
           安 
          
         
           装 
          
         
           规 
          
         
           则 
          
         
           , 
          
         
           安 
          
         
           装 
          
         
           的 
          
         
           内 
          
         
           容 
          
         
           包 
          
         
           括 
          
         
           二 
          
         
           进 
          
         
           制 
          
         
           可 
          
         
           执 
          
         
           行 
          
         
           文 
          
         
           件 
          
         
           、 
          
         
           动 
          
         
           态 
          
         
           库 
          
         
           、 
          
         
           静 
          
         
           态 
          
         
           库 
          
         
           以 
          
         
           及 
          
         
           文 
          
         
           件 
          
         
           、 
          
         
           目 
          
         
           录 
          
         
           、 
          
         
           脚 
          
         
           本 
          
         
           等 
          
         
           。 
          
         
           < 
          
         
           / 
          
         
           p 
          
         
           > 
          
         
           < 
          
         
           h 
          
         
           3 
          
         
           > 
          
         
           1.17.1 
          
         
           目 
          
         
           标 
          
         
           文 
          
         
           件 
          
         
           安 
          
         
           装 
          
         
           < 
          
         
           / 
          
         
           h 
          
         
           3 
          
         
           > 
          
         
           < 
          
         
           p 
          
         
           > 
          
         
           例 
          
         
           如 
          
         
           : 
          
         
           < 
          
         
           / 
          
         
           p 
          
         
           > 
          
         
           < 
          
         
           d 
          
         
           i 
          
         
           v 
          
         
           c 
          
         
           l 
          
         
           a 
          
         
           s 
          
         
           s 
          
         
           = 
          
         
           " 
          
         
           h 
          
         
           i 
          
         
           g 
          
         
           h 
          
         
           l 
          
         
           i 
          
         
           g 
          
         
           h 
          
         
           t 
          
         
           " 
          
         
           > 
          
         
           < 
          
         
           p 
          
         
           r 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           c 
          
         
           o 
          
         
           d 
          
         
           e 
          
         
           c 
          
         
           l 
          
         
           a 
          
         
           s 
          
         
           s 
          
         
           = 
          
         
           " 
          
         
           l 
          
         
           a 
          
         
           n 
          
         
           g 
          
         
           u 
          
         
           a 
          
         
           g 
          
         
           e 
          
         
           − 
          
         
           t 
          
         
           e 
          
         
           x 
          
         
           t 
          
         
           " 
          
         
           > 
          
         
           i 
          
         
           n 
          
         
           s 
          
         
           t 
          
         
           a 
          
         
           l 
          
         
           l 
          
         
           ( 
          
         
           T 
          
         
           A 
          
         
           R 
          
         
           G 
          
         
           E 
          
         
           T 
          
         
           S 
          
         
           u 
          
         
           t 
          
         
           i 
          
         
           l 
          
         
           R 
          
         
           U 
          
         
           N 
          
         
           T 
          
         
           I 
          
         
           M 
          
         
           E 
          
         
           D 
          
         
           E 
          
         
           S 
          
         
           T 
          
         
           I 
          
         
           N 
          
         
           A 
          
         
           T 
          
         
           I 
          
         
           O 
          
         
           N 
          
         
           b 
          
         
           i 
          
         
           n 
          
         
           L 
          
         
           I 
          
         
           B 
          
         
           R 
          
         
           A 
          
         
           R 
          
         
           Y 
          
         
           D 
          
         
           E 
          
         
           S 
          
         
           T 
          
         
           I 
          
         
           N 
          
         
           A 
          
         
           T 
          
         
           I 
          
         
           O 
          
         
           N 
          
         
           l 
          
         
           i 
          
         
           b 
          
         
           A 
          
         
           R 
          
         
           C 
          
         
           H 
          
         
           I 
          
         
           V 
          
         
           E 
          
         
           D 
          
         
           E 
          
         
           S 
          
         
           T 
          
         
           I 
          
         
           N 
          
         
           A 
          
         
           T 
          
         
           I 
          
         
           O 
          
         
           N 
          
         
           l 
          
         
           i 
          
         
           b 
          
         
           ) 
          
         
           < 
          
         
           / 
          
         
           c 
          
         
           o 
          
         
           d 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           / 
          
         
           p 
          
         
           r 
          
         
           e 
          
         
           > 
          
         
           < 
          
         
           / 
          
         
           d 
          
         
           i 
          
         
           v 
          
         
           > 
          
         
           < 
          
         
           p 
          
         
           > 
          
         
           A 
          
         
           R 
          
         
           C 
          
         
           H 
          
         
           I 
          
         
           V 
          
         
           E 
          
         
           指 
          
         
           静 
          
         
           态 
          
         
           库 
          
         
           , 
          
         
           L 
          
         
           I 
          
         
           B 
          
         
           R 
          
         
           A 
          
         
           R 
          
         
           Y 
          
         
           指 
          
         
           动 
          
         
           态 
          
         
           库 
          
         
           , 
          
         
           R 
          
         
           U 
          
         
           N 
          
         
           T 
          
         
           I 
          
         
           M 
          
         
           E 
          
         
           指 
          
         
           可 
          
         
           执 
          
         
           行 
          
         
           目 
          
         
           标 
          
         
           二 
          
         
           进 
          
         
           制 
          
         
           , 
          
         
           上 
          
         
           述 
          
         
           示 
          
         
           例 
          
         
           的 
          
         
           意 
          
         
           思 
          
         
           是 
          
         
           : 
          
         
           < 
          
         
           / 
          
         
           p 
          
         
           > 
          
         
           < 
          
         
           p 
          
         
           > 
          
         
           如 
          
         
           果 
          
         
           目 
          
         
           标 
          
         
           u 
          
         
           t 
          
         
           i 
          
         
           l 
          
         
           是 
          
         
           可 
          
         
           执 
          
         
           行 
          
         
           二 
          
         
           进 
          
         
           制 
          
         
           目 
          
         
           标 
          
         
           , 
          
         
           则 
          
         
           安 
          
         
           装 
          
         
           到 
          
         
        
          {CMAKE_CURRENT_LIST_DIR}")</code></pre></div><h3>1.17 安装</h3><p>install 指令用于定义安装规则,安装的内容包括二进制可执行文件、动态库、静态库以及文件、目录、脚本等。</p><h3>1.17.1 目标文件安装</h3><p>例如:</p><div class="highlight"><pre><code class="language-text">install(TARGETS util RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)</code></pre></div><p>ARCHIVE指静态库,LIBRARY指动态库,RUNTIME指可执行目标二进制,上述示例的意思是:</p><p>如果目标util是可执行二进制目标,则安装到 
         
       
      
      CMAKECURRENTLISTDIR")</code></pre></div><h3>1.17</h3><p>install</p><h3>1.17.1</h3><p></p><divclass="highlight"><pre><codeclass="languagetext">install(TARGETSutilRUNTIMEDESTINATIONbinLIBRARYDESTINATIONlibARCHIVEDESTINATIONlib)</code></pre></div><p>ARCHIVELIBRARYRUNTIME</p><p>util{CMAKE_INSTALL_PREFIX}/bin目录 如果目标util是静态库,则安装到安装到
      
      
       
        
         
          
          
            C 
           
          
            M 
           
          
            A 
           
          
            K 
           
           
           
             E 
            
           
             I 
            
           
          
            N 
           
          
            S 
           
          
            T 
           
          
            A 
           
          
            L 
           
           
           
             L 
            
           
             P 
            
           
          
            R 
           
          
            E 
           
          
            F 
           
          
            I 
           
          
            X 
           
          
         
           / 
          
         
           l 
          
         
           i 
          
         
           b 
          
         
           目 
          
         
           录 
          
         
           如 
          
         
           果 
          
         
           目 
          
         
           标 
          
         
           u 
          
         
           t 
          
         
           i 
          
         
           l 
          
         
           是 
          
         
           动 
          
         
           态 
          
         
           库 
          
         
           , 
          
         
           则 
          
         
           安 
          
         
           装 
          
         
           到 
          
         
           安 
          
         
           装 
          
         
           到 
          
         
        
          {CMAKE_INSTALL_PREFIX}/lib目录 如果目标util是动态库,则安装到安装到 
         
       
      
      CMAKEINSTALLPREFIX/libutil{CMAKE_INSTALL_PREFIX}/lib目录

1.17.2 文件夹安装

install(DIRECTORY include/ DESTINATION include/util)

这个语句的意思是将include/目录安装到include/util目录

1.18 设置编译选项

设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。 方式1

set( CMAKE_CXX_FLAGS "KaTeX parse error: Double subscript at position 400: …而set命令设置CMAKE_C_̲FLAGS或CMAKE_CXX…{PROJECT_SOURCE_DIR}/build;
  • CMAKE_INCLUDE_PATH-----------------------------------------系统环境变量,非cmake变量;
  • CMAKE_LIBRARY_PATH------------------------------------------系统环境变量,非cmake变量;
  • CMAKE_CURRENT_SOURCE_DIR---------------------------当前处理的CMakeLists.txt所在的路径;
  • CMAKE_CURRENT_BINARY_DIR-----------------------------target编译目录(使用ADD_SURDIRECTORY(src bin)可以更改此变量的值 ,SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径);
  • CMAKE_CURRENT_LIST_FILE--------------------------------输出调用这个变量的CMakeLists.txt的完整路径;
  • CMAKE_CURRENT_LIST_LINE--------------------------------输出这个变量所在的行;
  • CMAKE_MODULE_PATH-----------------------------------------定义自己的cmake模块所在的路径(这个变量用于定义自己的cmake模块所在的路径,如果你的工程比较复杂,有可能自己编写一些cmake模块,比如SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块);
  • EXECUTABLE_OUTPUT_PATH------------------------------重新定义目标二进制可执行文件的存放位置;
  • LIBRARY_OUTPUT_PATH--------------------------------------重新定义目标链接库文件的存放位置;
  • PROJECT_NAME-------------------------------------------------返回通过PROJECT指令定义的项目名称;
  • CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS—用来控制IF ELSE语句的书写方式;
  • 1.19.2 操作系统变量

    • CMAKE_MAJOR_VERSION-----------------------------cmake主版本号,如3.4.1中的3;
    • CMAKE_MINOR_VERSION-----------------------------cmake次版本号,如3.4.1中的4;
    • CMAKE_PATCH_VERSION-----------------------------cmake补丁等级,如3.4.1中的1;
    • CMAKE_SYSTEM----------------------------------------操作系统名称,包括版本名,如Linux-2.6.22;
    • CAMKE_SYSTEM_NAME-------------------------------操作系统名称,不包括版本名,如Linux;
    • CMAKE_SYSTEM_VERSION--------------------------操作系统版本号,如2.6.22;
    • CMAKE_SYSTEM_PROCESSOR--------------------电脑处理器名称,如i686;
    • UNIX--------------------------------------------------------在所有的类UNIX平台为TRUE,包括OS X和cygwin,Linux/Unix操作系统;
    • WIN32-----------------------------------------------------在所有的win32平台为TRUE,包括cygwin,Windows操作系统;
    • APPLE----------------------------------------------------苹果操作系统;

    例如操作系统判断方式一:

    if(WIN32)
    message(STATUS “This operating system is Windows.”)
    elseif(UNIX)
    message(STATUS “This operating system is Linux.”)
    elseif(APPLE)
    message(STATUS “This operating system is APPLE.”)
    endif(WIN32)

    操作系统判断方式二:

    if (CMAKE_SYSTEM_NAME MATCHES “Linux”)
    message(STATUS "current platform: Linux ")
    elseif (CMAKE_SYSTEM_NAME MATCHES “Windows”)
    message(STATUS “current platform: Windows”)
    elseif (CMAKE_SYSTEM_NAME MATCHES “FreeBSD”)
    message(STATUS “current platform: FreeBSD”)
    else ()
    message(STATUS "other platform: KaTeX parse error: Double subscript at position 251: …i><li>==CMAKE_C_̲FLAGS==--------…env{name}

    例如

    message(STATUS “
              
              
               
                
                 
                 
                   e 
                  
                 
                   n 
                  
                 
                   v 
                  
                  
                  
                    n 
                   
                  
                    a 
                   
                  
                    m 
                   
                  
                    e 
                   
                  
                 
                   " 
                  
                 
                   ) 
                  
                 
                   < 
                  
                 
                   / 
                  
                 
                   c 
                  
                 
                   o 
                  
                 
                   d 
                  
                 
                   e 
                  
                 
                   > 
                  
                 
                   < 
                  
                 
                   / 
                  
                 
                   p 
                  
                 
                   r 
                  
                 
                   e 
                  
                 
                   > 
                  
                 
                   < 
                  
                 
                   / 
                  
                 
                   d 
                  
                 
                   i 
                  
                 
                   v 
                  
                 
                   > 
                  
                 
                   < 
                  
                 
                   h 
                  
                 
                   3 
                  
                 
                   > 
                  
                 
                   1.19.5 
                  
                 
                   C 
                  
                 
                   M 
                  
                 
                   A 
                  
                 
                   K 
                  
                  
                  
                    E 
                   
                  
                    I 
                   
                  
                 
                   N 
                  
                 
                   C 
                  
                 
                   L 
                  
                 
                   U 
                  
                 
                   D 
                  
                  
                  
                    E 
                   
                  
                    C 
                   
                  
                 
                   U 
                  
                 
                   R 
                  
                 
                   R 
                  
                 
                   E 
                  
                 
                   N 
                  
                  
                  
                    T 
                   
                  
                    D 
                   
                  
                 
                   I 
                  
                 
                   R 
                  
                 
                   < 
                  
                 
                   / 
                  
                 
                   h 
                  
                 
                   3 
                  
                 
                   > 
                  
                 
                   < 
                  
                 
                   p 
                  
                 
                   > 
                  
                 
                   自 
                  
                 
                   动 
                  
                 
                   添 
                  
                 
                   加 
                  
                 
                   C 
                  
                 
                   M 
                  
                 
                   A 
                  
                 
                   K 
                  
                  
                  
                    E 
                   
                  
                    C 
                   
                  
                 
                   U 
                  
                 
                   R 
                  
                 
                   R 
                  
                 
                   E 
                  
                 
                   N 
                  
                  
                  
                    T 
                   
                  
                    B 
                   
                  
                 
                   I 
                  
                 
                   N 
                  
                 
                   A 
                  
                 
                   R 
                  
                  
                  
                    Y 
                   
                  
                    D 
                   
                  
                 
                   I 
                  
                 
                   R 
                  
                 
                   和 
                  
                 
                   C 
                  
                 
                   M 
                  
                 
                   A 
                  
                 
                   K 
                  
                  
                  
                    E 
                   
                  
                    C 
                   
                  
                 
                   U 
                  
                 
                   R 
                  
                 
                   R 
                  
                 
                   E 
                  
                 
                   N 
                  
                  
                  
                    T 
                   
                  
                    S 
                   
                  
                 
                   O 
                  
                 
                   U 
                  
                 
                   R 
                  
                 
                   C 
                  
                  
                  
                    E 
                   
                  
                    D 
                   
                  
                 
                   I 
                  
                 
                   R 
                  
                 
                   到 
                  
                 
                   当 
                  
                 
                   前 
                  
                 
                   处 
                  
                 
                   理 
                  
                 
                   的 
                  
                 
                   C 
                  
                 
                   M 
                  
                 
                   a 
                  
                 
                   k 
                  
                 
                   e 
                  
                 
                   L 
                  
                 
                   i 
                  
                 
                   s 
                  
                 
                   t 
                  
                 
                   s 
                  
                 
                   . 
                  
                 
                   t 
                  
                 
                   x 
                  
                 
                   t 
                  
                 
                   。 
                  
                 
                   相 
                  
                 
                   当 
                  
                 
                   于 
                  
                 
                   在 
                  
                 
                   每 
                  
                 
                   个 
                  
                 
                   C 
                  
                 
                   M 
                  
                 
                   a 
                  
                 
                   k 
                  
                 
                   e 
                  
                 
                   L 
                  
                 
                   i 
                  
                 
                   s 
                  
                 
                   t 
                  
                 
                   s 
                  
                 
                   . 
                  
                 
                   t 
                  
                 
                   x 
                  
                 
                   t 
                  
                 
                   加 
                  
                 
                   入 
                  
                 
                   : 
                  
                 
                   < 
                  
                 
                   / 
                  
                 
                   p 
                  
                 
                   > 
                  
                 
                   < 
                  
                 
                   d 
                  
                 
                   i 
                  
                 
                   v 
                  
                 
                   c 
                  
                 
                   l 
                  
                 
                   a 
                  
                 
                   s 
                  
                 
                   s 
                  
                 
                   = 
                  
                 
                   " 
                  
                 
                   h 
                  
                 
                   i 
                  
                 
                   g 
                  
                 
                   h 
                  
                 
                   l 
                  
                 
                   i 
                  
                 
                   g 
                  
                 
                   h 
                  
                 
                   t 
                  
                 
                   " 
                  
                 
                   > 
                  
                 
                   < 
                  
                 
                   p 
                  
                 
                   r 
                  
                 
                   e 
                  
                 
                   > 
                  
                 
                   < 
                  
                 
                   c 
                  
                 
                   o 
                  
                 
                   d 
                  
                 
                   e 
                  
                 
                   c 
                  
                 
                   l 
                  
                 
                   a 
                  
                 
                   s 
                  
                 
                   s 
                  
                 
                   = 
                  
                 
                   " 
                  
                 
                   l 
                  
                 
                   a 
                  
                 
                   n 
                  
                 
                   g 
                  
                 
                   u 
                  
                 
                   a 
                  
                 
                   g 
                  
                 
                   e 
                  
                 
                   − 
                  
                 
                   t 
                  
                 
                   e 
                  
                 
                   x 
                  
                 
                   t 
                  
                 
                   " 
                  
                 
                   > 
                  
                 
                   i 
                  
                 
                   n 
                  
                 
                   c 
                  
                 
                   l 
                  
                 
                   u 
                  
                 
                   d 
                  
                  
                  
                    e 
                   
                  
                    d 
                   
                  
                 
                   i 
                  
                 
                   r 
                  
                 
                   e 
                  
                 
                   c 
                  
                 
                   t 
                  
                 
                   o 
                  
                 
                   r 
                  
                 
                   i 
                  
                 
                   e 
                  
                 
                   s 
                  
                 
                   ( 
                  
                 
                
                  env{name}")</code></pre></div><h3>1.19.5 CMAKE_INCLUDE_CURRENT_DIR</h3><p>自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理 的CMakeLists.txt。 相当于在每个CMakeLists.txt加入:</p><div class="highlight"><pre><code class="language-text">include_directories( 
                 
               
              
              envname")</code></pre></div><h3>1.19.5CMAKEINCLUDECURRENTDIR</h3><p>CMAKECURRENTBINARYDIRCMAKECURRENTSOURCEDIRCMakeLists.txtCMakeLists.txt</p><divclass="highlight"><pre><codeclass="languagetext">includedirectories({CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

    1.20 条件判断

    1.20.1 逻辑判断和比较

    • if (expression):expression 不为空时为真,false的值包括(0,N,NO,OFF,FALSE,NOTFOUND);
    • if (not exp):与上面相反;
    • if (var1 AND var2):如果两个变量都为真时为真;
    • if (var1 OR var2):如果两个变量有一个为真时为真;
    • if (COMMAND cmd):如果 cmd 确实是命令并可调用为真;
    • if (EXISTS dir) if (EXISTS file):如果目录或文件存在为真;
    • if (file1 IS_NEWER_THAN file2):当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径;
    • if (IS_DIRECTORY dir):当 dir 是目录时为真;
    • if (DEFINED var):如果变量被定义为真;
    • if (var MATCHES regex):给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用 v a r ; < / l i > < l i > = = i f ( s t r i n g M A T C H E S r e g e x ) = = : 给 定 的 字 符 串 能 够 匹 配 正 则 表 达 式 r e g e x 时 为 真 。 < / l i > < / u l > < h 3 > 1.20.2 数 字 比 较 < / h 3 > < u l > < l i > = = i f ( v a r i a b l e L E S S n u m b e r ) = = : 如 果 v a r i a b l e 小 于 n u m b e r 时 为 真 ; < / l i > < l i > = = i f ( s t r i n g L E S S n u m b e r ) = = : 如 果 s t r i n g 小 于 n u m b e r 时 为 真 ; < / l i > < l i > = = i f ( v a r i a b l e G R E A T E R n u m b e r ) = = : 如 果 v a r i a b l e 大 于 n u m b e r 时 为 真 ; < / l i > < l i > = = i f ( s t r i n g G R E A T E R n u m b e r ) = = : 如 果 s t r i n g 大 于 n u m b e r 时 为 真 ; < / l i > < l i > = = i f ( v a r i a b l e E Q U A L n u m b e r ) = = : 如 果 v a r i a b l e 等 于 n u m b e r 时 为 真 ; < / l i > < l i > = = i f ( s t r i n g E Q U A L n u m b e r ) = = : 如 果 s t r i n g 等 于 n u m b e r 时 为 真 。 < / l i > < / u l > < h 3 > 1.20.3 字 母 表 顺 序 比 较 < / h 3 > < u l > < l i > = = i f ( v a r i a b l e S T R L E S S s t r i n g ) = = < / l i > < l i > = = i f ( s t r i n g S T R L E S S s t r i n g ) = = < / l i > < l i > = = i f ( v a r i a b l e S T R G R E A T E R s t r i n g ) = = < / l i > < l i > = = i f ( s t r i n g S T R G R E A T E R s t r i n g ) = = < / l i > < l i > = = i f ( v a r i a b l e S T R E Q U A L s t r i n g ) = = < / l i > < l i > = = i f ( s t r i n g S T R E Q U A L s t r i n g ) = = < / l i > < / u l > < h 3 > 1.21 循 环 < / h 3 > < h 3 > 1.21.1 f o r e a c h < / h 3 > < p > s t a r t 表 示 起 始 数 , s t o p 表 示 终 止 数 , s t e p 表 示 步 长 < / p > < d i v c l a s s = " h i g h l i g h t " > < p r e > < c o d e c l a s s = " l a n g u a g e − t e x t " > f o r e a c h ( l o o p v a r R A N G E s t a r t s t o p [ s t e p ] ) . . . e n d f o r e a c h ( l o o p v a r ) < / c o d e > < / p r e > < / d i v > < h 3 > 1.21.2 w h i l e < / h 3 > < d i v c l a s s = " h i g h l i g h t " > < p r e > < c o d e c l a s s = " l a n g u a g e − t e x t " > w h i l e ( c o n d i t i o n ) . . . e n d w h i l e ( ) < / c o d e > < / p r e > < / d i v > < h 3 > 1.22 自 动 检 测 编 译 器 是 否 支 持 C + + 11 < / h 3 > < d i v c l a s s = " h i g h l i g h t " > < p r e > < c o d e c l a s s = " l a n g u a g e − t e x t " > i n c l u d e ( C h e c k C X X C o m p i l e r F l a g ) C H E C K C X X C O M P I L E R F L A G ( " − s t d = c + + 11 " C O M P I L E R S U P P O R T S C X X 11 ) C H E C K C X X C O M P I L E R F L A G ( " − s t d = c + + 0 x " C O M P I L E R S U P P O R T S C X X 0 X ) i f ( C O M P I L E R S U P P O R T S C X X 11 ) s e t ( C M A K E C X X F L A G S " {var};</li><li>==if (string MATCHES regex)==:给定的字符串能够匹配正则表达式regex时为真。</li></ul><h3>1.20.2 数字比较</h3><ul><li>==if (variable LESS number)==:如果variable小于number时为真;</li><li>==if (string LESS number)==:如果string小于number时为真;</li><li>==if (variable GREATER number)==:如果variable大于number时为真;</li><li>==if (string GREATER number)==:如果string大于number时为真;</li><li>==if (variable EQUAL number)==:如果variable等于number时为真;</li><li>==if (string EQUAL number)==:如果string等于number时为真。</li></ul><h3>1.20.3 字母表顺序比较</h3><ul><li>==if (variable STRLESS string)==</li><li>==if (string STRLESS string)==</li><li>==if (variable STRGREATER string)==</li><li>==if (string STRGREATER string)==</li><li>==if (variable STREQUAL string)==</li><li>==if (string STREQUAL string)==</li></ul><h3>1.21 循环</h3><h3>1.21.1 foreach</h3><p>start 表示起始数,stop 表示终止数,step 表示步长</p><div class="highlight"><pre><code class="language-text">foreach(loop_var RANGE start stop [step]) ... endforeach(loop_var)</code></pre></div><h3>1.21.2 while</h3><div class="highlight"><pre><code class="language-text">while(condition) ... endwhile()</code></pre></div><h3>1.22 自动检测编译器是否支持C++11</h3><div class="highlight"><pre><code class="language-text">include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS " var</li><li>==if(stringMATCHESregex)==regex</li></ul><h3>1.20.2</h3><ul><li>==if(variableLESSnumber)==variablenumber</li><li>==if(stringLESSnumber)==stringnumber</li><li>==if(variableGREATERnumber)==variablenumber</li><li>==if(stringGREATERnumber)==stringnumber</li><li>==if(variableEQUALnumber)==variablenumber</li><li>==if(stringEQUALnumber)==stringnumber</li></ul><h3>1.20.3</h3><ul><li>==if(variableSTRLESSstring)==</li><li>==if(stringSTRLESSstring)==</li><li>==if(variableSTRGREATERstring)==</li><li>==if(stringSTRGREATERstring)==</li><li>==if(variableSTREQUALstring)==</li><li>==if(stringSTREQUALstring)==</li></ul><h3>1.21</h3><h3>1.21.1foreach</h3><p>startstopstep</p><divclass="highlight"><pre><codeclass="languagetext">foreach(loopvarRANGEstartstop[step])...endforeach(loopvar)</code></pre></div><h3>1.21.2while</h3><divclass="highlight"><pre><codeclass="languagetext">while(condition)...endwhile()</code></pre></div><h3>1.22C++11</h3><divclass="highlight"><pre><codeclass="languagetext">include(CheckCXXCompilerFlag)CHECKCXXCOMPILERFLAG("std=c++11"COMPILERSUPPORTSCXX11)CHECKCXXCOMPILERFLAG("std=c++0x"COMPILERSUPPORTSCXX0X)if(COMPILERSUPPORTSCXX11)set(CMAKECXXFLAGS"{CMAKE_CXX_FLAGS} -std=c++11”)
      elseif(COMPILER_SUPPORTS_CXX0X)
      set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++0x”)
      else()
      message(STATUS "The compiler KaTeX parse error: Expected 'EOF', got '#' at position 473: …demo demo.cpp) #̲ 生成可执行文件 add_li…{第三方库项目名称} PROPERTIES FOLDER “目标文件夹名称”)

2 错误解决方案

2.1 Cannot specify link libraries for target “/…/…/lib/linux/libMyDll.a” which

这个问题要将生成执行文件、静态库、动态库的声明

add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库

放在

target_link_libraries()

之前。

2.2 警告:检测到时钟错误。您的创建可能是不完整的。

在项目根目录下执行命令:

touch *

更新所有文件时间。

发布于 2020-11-27
CMake
效率手册
赞同 10​
添加评论
微信二维码分享
喜欢 ​ 收藏 ​ 申请转载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值