Cmake-learning

发布于:2024-05-16 ⋅ 阅读:(52) ⋅ 点赞:(0)

可以把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) #生成动态库文件

新接触一个项目,了解项目组织结构的最快方式就是看编译流程~通过重点关注目标文件、目标库的生成流程,我们可以清晰的看到庞大项目的脉络。


网站公告

今日签到

点亮在社区的每一天
去签到