Cmake学习笔记:入门

学习材料:《CMake实践.pdf

基本命令:

1.定义工程名称:

PROJECT(projectname [CXX][C][JAVA])

同时隐含变量:

1)PROJECT_BINARY_DIR/projectname_BINARY_DIR

2)PROJECT_SOURCE_DIR/projectname_SOURCE _DIR

内部编译均为工程目录,外部编译(build目录下执行cmake ../)下,PROJECT_SOURCE_DIR为代码目录,PROJECT_BINARY_DIR为代码目录下的build目录。

2.设置环境变量:

SET(var [VALUE])

引用环境变量是通过${},在IF判断中直接使用环境变量。

3.输出信息:

MESSAGE([SEND_ERROR|STATUS|FATAL_ERROR] “message to display ” ...)

SEND_ERROR产生错误,生成过程跳过;

STATUS输出前缀为-的信息;

FATAL_ERROR产生错误,立即终止cmake

4.生成执行文件:

ADD_EXECUTABLE(exename src_list)

详见实例一。

5.添加源文件子目录:

ADD_SUBDIRECTORY(source_dir [bin_dir] [EXCLUDE_ROM_ALL])

source_dir为添加源文件的子目录;

bin_dir指定中间二进制和目标二进制存放的位置。此外,通过EXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATH可以设置二进制可执行文件和库文件存放的位置。

EXCLUDE_ROM_ALLsource_dir从编译过程中排出。

详见实例二。

6.安装INSTALL

目标文件的安装:

INSTALL(TARGET targets...

        [ARCHIVE|LIBRARY|RUNTIME]

        [DESTINATION

]

)

targets为我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,不用写目录,不用写lib前缀。

ARCHIVE:静态库,LIBRARY:动态库,RUNTIME:可执行目标二进制。

DESTINATION指定安装路径,如果以/开头,是绝对路径,这样CMAKE_INSTALL_PREFIX就无效了。否则,安装目录在CMAKE_INSTALL_PREFIX前缀下。

普通文件的安装:

INSTALL(FILES files...

        [DESTINATION

]

        [PERMISSIONS permissions...]

)

默认权限644

非目标文件的可执行程序安装(比如脚本):

INSTALL(Programs files...

        [DESTINATION

]

        [PERMISSIONS permissions...]

)

默认权限755

目录的安装:

INSTALL(DIRECTORY dirs...

        [DESTINATION

]

        [PERMISSIONS permissions...]

        [PATTERN ]

)

dirs的目录是Source目录的相对路径。dirs不以/结尾,安装到目标目录的dirs目录下;dirs/结尾,将目录中内容安装到目标目录,不包括dirs本身目录。

PATTERN用于使用正则表达式进行过滤。

安装时通过cmake -DCMAKE_INSTALL_PREFIX=/tmp/ .. 指定安装目录前缀

7.编译共享库:

ADD_LIBRARY(libname [SHARED|STATIC]

        [EXCLUDE_FROM_ALL] source1...

)

SHARED表示动态库,STATIC表示静态库。

EXCLUDE_FROM_ALL表示该库不进行构建,除非包含srouce1...

8.设置输出名、动态库版本等

SET_TARGET_PROPERTIES(hello_s PROPERTIES OUTPUT_NAME hello)

详见实例三。

 

实例一:编译可执行文件

conanswp@ubuntu:~/cmake/test1$ ls

build  CMakeLists.txt  main.cpp

ROJECT(HelloCMake)

SET(SRC_LISTS main.cpp)

MESSAGE(STATUS "BINARY DIR IS " ${HelloCMake_BINARY_DIR})

MESSAGE(STATUS "SOURCE DIR IS " ${HelloCMake_SOURCE_DIR})

ADD_EXECUTABLE(main ${SRC_LISTS})

实例二:添加代码目录

├── build

├── CMakeLists.txt

└── src

    ├── CMakeLists.txt

    └── main.cpp

PROJECT(HelloCMake)

ADD_SUBDIRECTORY(src bin)

SET(SRC_LISTS main.cpp)

MESSAGE(STATUS "BINARY DIR IS " ${HelloCMake_BINARY_DIR})

MESSAGE(STATUS "SOURCE DIR IS " ${HelloCMake_SOURCE_DIR})

ADD_EXECUTABLE(main ${SRC_LISTS})

这样,产生的二进制文件会生成到build/bin目录下。

实例三:生成共享库

├── build

├── CMakeLists.txt

└── src

    ├── CMakeLists.txt

    ├── hello.cpp

    └── hello.h

PROJECT(HelloLib)

ADD_SUBDIRECTORY(src lib)

SET(SRC_LISTS hello.cpp hello.h)

ADD_LIBRARY(hello SHARED ${SRC_LISTS})

#不能同为hello,目标只能有一个

ADD_LIBRARY(hello_s STATIC ${SRC_LISTS})

#设置静态库输出名称

SET_TARGET_PROPERTIES(hello_s PROPERTIES OUTPUT_NAME hello)

 

你可能感兴趣的:(CMake)