cmake的学习
Cmake
简易工程学习
cmake 是一个跨平台的自动构建工具 ,用来生成Makefile,不用动手编写Makefile。
对于一个初始的C语言程序来说使用cmke进行构建。
1 |
|
创建CMakeLists.txt文件,CMakeLists.txt文件会被cmake工具解析 ,写入内容
1 | project(HELLO) #设置工程名称 |
执行cmake命令
1 | cmake ./ |
之后就会生成makefile文件,可以使用make进行编译。
使用out-of-source方式进行构建,来将工程生成的文件何源文件分离开。
然后在工程目录下创建一个 build 目录
1 | cd build/ |
这样 cmake 生成的中间文件以及 make 编译生成的可执行文件就全部在 build 目录下了,如果要清理工程,直接删除 build 目录即可,这样就方便多了。
当对应的源文件是多个文件时候,例如main.c hello.c
1 | add_executable(hello main.c hello.c) |
编译动态库/静态库
动态库
:以.so
作为后缀静态库
:通常以.a
或.la
作为后缀。
1 | add_library(libhello SHARED hello.c) #生成动态库文件 |
这时生成的库名字是liblibhello.a,可以通过set_target_properties 来修改工程的名字。
1 | set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello") |
通过 set_target_properties 命令对 libhello 目标的OUTPUT_NAME 属性进行了设置,将其设置为 hello
大工程分层存储文件夹
使用add_subdirectory来添加子目录并构建子目录。
当前目录为
1 | ├── build #build 目录 |
顶层 CMakeLists.txt
1
2
3 project(HELLO)
add_subdirectory(libhello)
add_subdirectory(src)src 目录下的 CMakeLists.txt
1
2
3
4 include_directories(${PROJECT_SOURCE_DIR}/libhello)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(hello main.c)
target_link_libraries(hello libhello)libhello 目录下的 CMakeLists.txt
1
2
3 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
最终得到:
1 | ├── build |
基础指令
全部命令查看官方文档https://cmake.org/cmake/help/v3.5/manual/cmake-commands.7.html
参数间隔用空格
1 | add_executable(<name> source1 source2...) |
mode | 说明 |
---|---|
none(无) | 重要信息、普通信息 |
STATUS | 附带信息 |
WARNING | CMake警告,继续处理 |
AUTHOR_WARNINIG | CMake警告(开发),继续处理 |
SEND_ERROR | CMake错误,继续处理,但跳过生成 |
FALTAL_ERROR | CMake错误,停止处理和生成 |
DEPRECATION | 如 果 变 量 CMAKE_ERROR_DEPRECATED 或CMAKE_WARN_DEPRECATED 分别启用, 则 CMake 弃用错 |
误或警告,否则没有消息。 |
1 | # 设置工程名称为 HELLO |
eg:
写一个指针的斐波那契数列(非递归指针方式实现)
main.c
1 |
|
function.c
1 |
|
function.h
1 |
|
1 | tree #使用tree输出树状结构 |
1 | #src下的CMakeLists.txt内容 |
1 | #lib下的CMakeLists.txt内容 |
1 | #工程目录下的CMakeLists.txt内容 |