天天看点

Cmake使用笔记,Cmakelist编写

1.常用命令

project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
           

将Name存到

PROJECT_NAME,同时设置变量

  • PROJECT_SOURCE_DIR

    <PROJECT-NAME>_SOURCE_DIR

  • PROJECT_BINARY_DIR

    <PROJECT-NAME>_BINARY_DIR

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
           

指定头文件的搜索路径,相当于指定gcc的-I参数 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录

target_link_libraries(<target> ... <item>... ...)
           

添加链接库,相同于指定-l参数 TARGET_LINK_LIBRARIES(demo Hello) #将可执行文件与Hello连接成最终文件demo

link_directories(directory1 directory2 ...)
           

动态链接库或静态链接库的搜索路径,相当于gcc的-L参数 

LINK_DIRECTORIES(${HELLO_BINARY_DIR}/Hello)#增加Hello为link目录

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2 ...])
           

ADD_LIBRARY(Hellohello.cxx) #将hello.cxx编译成静态库如libHello.a

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               [source1] [source2 ...])
           

ADD_EXECUTABLE(helloDemo demo.cxx demo_b.cxx) 指定编译,好像也可以添加.o文件,将cxx编译成可执行文件

add_subdirectory(source_dir [binary_dir]
                 [EXCLUDE_FROM_ALL])
           

ADD_SUBDIRECTORY(Hello) #包含子目录

aux_source_directory(<dir> <variable>)
           

基本语法是:

AUX_SOURCE_DIRECTORY(dir VARIABLE)

,作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表,因为目前cmake还不能自动发现新添加的源文件。比如:

  • 1 AUX_SOURCE_DIRECTORY(. SRC_LIST)
  • 2 ADD_EXECUTABLE(main ${SRC_LIST})

可以通过后面提到的

FOR EACH

指令来处理这个LIST。

cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])
           

比如:CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR) 

如果cmake版本小与2.5,则出现严重错误,整个过程中止。

2.(转)常用变量

CMAKE_BINARY_DIR 

PROJECT_BINARY_DIR 

< projectname >_BINARY_DIR 

这三个变量指代的内容是一致的,如果是in-source编译,指得就是工程顶层目录;如果是out-of-source编译,指的是工程编译发生的目录。

PROJECT_BINARY_DIR

跟其它指令稍有区别,目前可以认为它们是一致的。

CMAKE_SOURCE_DIR 

PROJECT_SOURCE_DIR 

< projectname >_SOURCE_DIR 

这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。也就是在in-source编译时,他跟

CMAKE_BINARY_DIR

等变量一致。

PROJECT_SOURCE_DIR

跟其它指令稍有区别,目前可以认为它们是一致的。 

(out-of-source build与in-source build相对,指是否在CMakeLists.txt所在目录进行编译。)

CMAKE_CURRENT_SOURCE_DIR 

当前处理的CMakeLists.txt所在的路径,比如上面我们提到的src子目录。

CMAKE_CURRRENT_BINARY_DIR 

如果是in-source编译,它跟

CMAKE_CURRENT_SOURCE_DIR

一致;如果是out-of-source编译,指的是target编译目录。使用

ADD_SUBDIRECTORY(src bin)

可以更改这个变量的值。使用

SET(EXECUTABLE_OUTPUT_PATH <新路径>)

并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。

CMAKE_CURRENT_LIST_FILE 

输出调用这个变量的CMakeLists.txt的完整路径

CMAKE_CURRENT_LIST_LINE 

输出这个变量所在的行

CMAKE_MODULE_PATH 

这个变量用来定义自己的cmake模块所在的路径。如果工程比较复杂,有可能会自己编写一些cmake模块,这些cmake模块是随工程发布的,为了让cmake在处理CMakeLists.txt时找到这些模块,你需要通过SET指令将cmake模块路径设置一下。比如

SET(CMAKE_MODULE_PATH,${PROJECT_SOURCE_DIR}/cmake)

这时候就可以通过INCLUDE指令来调用自己的模块了。

EXECUTABLE_OUTPUT_PATH 

新定义最终结果的存放目录

LIBRARY_OUTPUT_PATH 

新定义最终结果的存放目录

PROJECT_NAME 

返回通过

PROJECT

指令定义的项目名称。

继续阅读