cmake入门篇--多文件编译

 

cmake相关链接

cmake门口观望篇-单文件编译


目录

1 多文件编译-单个目录下

aux_source_directory 将制定路径下所有源文件保存到变量

2 多文件不在同一目录

2.1 不使用链接库

include_directories 添加头文件路径

2.2 使用动态链接库

add_subdirectory 添加外部路径

add_library 用指定文件编译库文件

2.3 使用静态链接库


1 多文件编译-单个目录下

单个目录下多文件比较简单,只需要在单文件编译基础上,把所有文件添加到add_executable()源文件列表即可,下面举个例子说明

文件结构如下,其中buil是外部构建时使用的,用来放构建文件,使源文件与构建文件隔离,关于外部构建单文件编译中有提到

dawn@DAWN-AMD:~/workstation/cmaketest$ tree
.
├── CMakeLists.txt
├── build
├── main.c
├── sayhello.c
└── sayhello.h

文件内容:

./CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8)
    project(CMakeTest)
    add_executable(cmaketest sayhello.c main.c)

./main.c:
	#include"sayhello.h"
	int main()
	{
	    sayhello();
	}
./sayhello.c:
	#include"sayhello.h"
	void sayhello()
	{
	    printf("hello CMake !\n");
	}
	
./sayhello.h:
	#include<stdio.h>
	void sayhello(void);

然后执行cmake . && make就可以编译出可执行程序cmaketest

aux_source_directory 将指定路径下所有源文件保存到变量

但是当有很多文件时,一个一个写到add_executable里显然是很麻烦的事,我们可以借助aux_source_directory实现将整个目录下所有源文件加到工程,具体用法:

aux_source_directory(<dir> <variable>)

该命令会将指定目录下的所有源文件保存存到指定变量名中。于是上面的CMakeLists.txt可以简写成

./CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8)
    project(CMakeTest)
    aux_source_directory(. all_src)
    add_exEcutablE(cmaketest ${all_src})

 aux_source_directory(. all_src) 将"."目录(当前CMakeLists.txt所在目录)下的所有源文件保存到all_src变量中

2 多文件不在同一目录

将上面的例子中的sayhello.c 和 sayhello.h放到sayhello目录下

.
├── CMakeLists.txt
├── build
├── main.c
└── sayhello
    ├── sayhello.c
    └── sayhello.h

我们还是遵从由浅入深原则,逐步提升,首先在上个例子的CmakeList里修改

2.1 不使用链接库

cmake_minimum_required(VERSION 2.8)
project(CMakeTest)
include_directories("./sayhello")
aux_source_directory(./sayhello sayhello_src)
add_executable(cmaketest ${sayhello_src} main.c)

include_directories 添加头文件路径

这里我们比前面多了一个指令include_directories, 这个指令用于添加头文件查找路径,类似于Makefile里的-I$(inclidedir)选项, 用于工程查找#include包含的头文件,如果不加这一句构建时不会报错,但编译时会提示找不到头文件

上面的方式不使用链接库,只需要一个CMakeLists.txt便可完成,但所有的模块都放在一个文件里管理不利于模块化编程,适用于较小的工程,当工程较大,且模块间相对独立时,往往使用链接库的形式,

2.2 使用动态链接库

下面我们将sayhello编成动态库libsayhello.so,在根目录链接动态库,此时需要在sayhello目录下添加一个cmake构建文件CMakeLists.txt,目录结构如下所示

.
├── CMakeLists.txt
├── build
├── main.c
└── sayhello
    ├── CMakeLists.txt
    ├── sayhello.c
    └── sayhello.h

根目录下的. CMakeLists.txt

dawn@DAWN-AMD:~/workstation/cmaketest$ cat ./CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(CMakeTest)
include_directories("./sayhello")
aux_source_directory(./ main_src)
add_subdirectory(sayhello)
add_executable(cmaketest ${main_src})
target_link_libraries(cmaketest sayhello)

 接下来cd到build目录即可进行外面构建和编译,可以看到在build路径下生成了可执行文件和动态库,当然,这个安装路径我们可以在CMakeLists.txt指定 

dawn@DAWN-AMD:~/workstation/cmaketest$ cd build/
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cmake && make
dawn@DAWN-AMD:~/workstation/cmaketest$ tree -L 3
.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── cmaketest
│   └── sayhello
│       ├── CMakeFiles
│       ├── Makefile
│       ├── cmake_install.cmake
│       └── libsayhello.so
├── main.c
└── sayhello
    ├── CMakeLists.txt
    ├── sayhello.c
    └── sayhello.h

这里用了两个指令,

add_subdirectory 添加外部路径

命令语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

命令简述:用于添加一个需要进行构建的子目录

实际构建时会加载添加的目录下的CMakeLists.txt进行构建

命令语法:target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)

命令简述:用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)

子级目录sayhello下的CMakeLists.txt

dawn@DAWN-AMD:~/workstation/cmaketest$ cat ./sayhello/CMakeLists.txt
aux_source_directory(. LIB_SRCS)     # 添加当前目录下所有的源文件
add_library (sayhello SHARED ${LIB_SRCS})   # 当前目录下的文件生成一个链接库

add_library 用指定文件编译库文件

命令语法:add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)

命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个库文件且命名为 name

参数详解见add_library参数详解

2.3 使用静态链接库

使用静态链接方法与使用动态链接一致,只需将生成库指定为STATIC即可,即

dawn@DAWN-AMD:~/workstation/cmaketest$ cat ./sayhello/CMakeLists.txt
aux_source_directory(. LIB_SRCS)     # 添加当前目录下所有的源文件
add_library (sayhello STATIC ${LIB_SRCS})   # 当前目录下的文件生成一个链接库

 


引用:

https://blog.csdn.net/weixin_39956356/article/details/100504979

https://www.cnblogs.com/wuchaodzxx/p/8916009.html

https://blog.csdn.net/bigdog_1027/article/details/79113342

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值