可以把cmake看成一款自动生成 Makefile的工具,所以编译流程就变成了:cmake—>make–>可执行文件
在哪个目录执行cmake +txt位置 就会在哪个目录生成构造文件和可执行文件
project(HELLO): 非强制,指明项目名称
add_executable(hello ./main.c):
add_executable(目标bin名字 源函数):
有多个源文件要编译,则可以用变量存起所有.c源文件,.h则放在和.c一起就行,就变成
set(SRC_LIST main.c hello.c)
add_executable(hello $( SRC_LIST)):
将某些源文件编译成库文件方法
add_library(目标库名称SHARED hello.c) #生成动态库文件
add_library(目标库名称STATIC hello.c) #生成静态库文件
可以给生成的库改名
set_target_properties(目标库名称PROPERTIES OUTPUT_NAME "改名")
设置库文件的默认输出目录:
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
找到指定库:
find_library(存放库路径变量 指定库名称 HINTS 库路径)
find_library(TESTFUNC_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/testFunc/lib)
将目标文件和库文件链接
target_link_libraries (目标文件 库文件})
target_link_libraries (main ${TESTFUNC_LIB})
set语法:
set(<variable_name> <value> [CACHE <type> <docstring> [FORCE]])
将源文件搞到一个变量中:
set( SRC_LIST
./main.c
./testFunc1.c
./testFunc.c)
cmake提供了一个命令可以把指定目录下所有的源文件存储在一个变量中,这个命令就是
aux_source_directory(指定目录 变量)
一般是这样用的:
aux_source_directory(. SRC_LIST)
add_executable(main ${SRC_LIST})
代码分层的情况下编写cmake
CMakeLists.txt和main.c在同一目录下
向工程添加多个指定头文件的搜索路径,路径之间用空格分隔
include_directories (路径1 路径2 … …)
include_directories (test_func test_func1)
也可以在main.c中include来达到一样的目的
#include "test_func/testFunc.h"
#include "test_func1/testFunc1.h"
更正规一点,就是一层一层解析cmake
增加编译子目录。其基本语法格式是:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
add_subdirectory(子目录 [输出bin目录] [标志])
子目录是包含源文件和txt的,相当将子.txt拷贝到父.txt
预定义变量:
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
这里的set其实是和前面的一样,只是EXECUTABLE_OUTPUT_PATH是个系统自带的预定义变量,其意义如下:
EXECUTABLE_OUTPUT_PATH :目标二进制可执行文件的存放位置
PROJECT_SOURCE_DIR:工程的根目录
所以,这里set的意思是把存放elf文件的位置设置为工程根目录下的bin目录。
其实不管再怎么样,我认为重点关注的只有:
生成目标文件这句,
add_executable(hello $( SRC_LIST)):
有的时候目标文件会暂时没指定,那么就看有米有这个语句:target_sources(目标文件 源文件),这是指定目标文件的源文件的语句。
以及生成库这句,
add_library(目标库名称SHARED hello.c) #生成动态库文件
新接触一个项目,了解项目组织结构的最快方式就是看编译流程~通过重点关注目标文件、目标库的生成流程,我们可以清晰的看到庞大项目的脉络。