cmake相关链接
cmake门口观望篇-单文件编译
目录
1 多文件编译-单个目录下
aux_source_directory 将制定路径下所有源文件保存到变量
2 多文件不在同一目录
2.1 不使用链接库
include_directories 添加头文件路径
2.2 使用动态链接库
add_subdirectory 添加外部路径
target_link_libraries 将目标文件与库文件进行链接
add_library 用指定文件编译库文件
2.3 使用静态链接库
单个目录下多文件比较简单,只需要在单文件编译基础上,把所有文件添加到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
void sayhello(void);
然后执行cmake . && make就可以编译出可执行程序cmaketest
但是当有很多文件时,一个一个写到add_executable里显然是很麻烦的事,我们可以借助aux_source_directory
实现将整个目录下所有源文件加到工程,具体用法:
aux_source_directory(
该命令会将指定目录下的所有源文件保存存到指定变量名中。于是上面的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变量中
将上面的例子中的sayhello.c 和 sayhello.h放到sayhello目录下
.
├── CMakeLists.txt
├── build
├── main.c
└── sayhello
├── sayhello.c
└── sayhello.h
我们还是遵从由浅入深原则,逐步提升,首先在上个例子的CmakeList里修改
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, 这个指令用于添加头文件查找路径,类似于Makefile里的-I$(inclidedir)选项, 用于工程查找#include包含的头文件,如果不加这一句构建时不会报错,但编译时会提示找不到头文件
上面的方式不使用链接库,只需要一个CMakeLists.txt便可完成,但所有的模块都放在一个文件里管理不利于模块化编程,适用于较小的工程,当工程较大,且模块间相对独立时,往往使用链接库的形式,
下面我们将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(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
命令简述:用于添加一个需要进行构建的子目录
实际构建时会加载添加的目录下的CMakeLists.txt进行构建
命令语法:target_link_libraries(
命令简述:用于指定 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([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)
命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个库文件且命名为 name
参数详解见add_library参数详解
使用静态链接方法与使用动态链接一致,只需将生成库指定为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