学习材料:《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_PATH和LIBRARY_OUTPUT_PATH可以设置二进制可执行文件和库文件存放的位置。
EXCLUDE_ROM_ALL将source_dir从编译过程中排出。
详见实例二。
6.安装INSTALL:
|
目标文件的安装: INSTALL(TARGET targets... [ARCHIVE|LIBRARY|RUNTIME] [DESTINATION <dir>] ) targets为我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,不用写目录,不用写lib前缀。 ARCHIVE:静态库,LIBRARY:动态库,RUNTIME:可执行目标二进制。 DESTINATION指定安装路径,如果以/开头,是绝对路径,这样CMAKE_INSTALL_PREFIX就无效了。否则,安装目录在CMAKE_INSTALL_PREFIX前缀下。 |
|
普通文件的安装: INSTALL(FILES files... [DESTINATION <dir>] [PERMISSIONS permissions...] ) 默认权限644。 |
|
非目标文件的可执行程序安装(比如脚本): INSTALL(Programs files... [DESTINATION <dir>] [PERMISSIONS permissions...] ) 默认权限755。 |
|
目录的安装: INSTALL(DIRECTORY dirs... [DESTINATION <dir>] [PERMISSIONS permissions...] [PATTERN <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}) |
实例二:添加代码目录
|
├── 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) |
1224

被折叠的 条评论
为什么被折叠?



