使用CMake将代码编译成静态库,并在另一个项目使用它
将项目lib1编译成静态库,供test1来使用,本文仅是说明cmake构建项目的一个简单用法,所以内容比较简单
lib1项目目录结构##
lib1/
|-- CMakeLists.txt
|-- include
| `-- a.h
`-- src
`-- a.c
a.c
#include "a.h"
int add111(int a, int b){
return a+b;
}
a.h
#ifndef A_H
#define A_H
int add111(int a, int b);
#endif
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(lib1)
file(GLOB lib_src "./src/*.c")
add_library(lib ${lib_src})
target_include_directories(lib PUBLIC "./include")
下面是对CmakeLists的具体解释:
- cmake_minimum_required(VERSION 3.16)
指定对cmake的版本要求 - project(lib1)
指定项目名称 - file(GLOB lib_src “./src/*.c”)
通过GLOB将src文件夹所有以 .c 结尾的文件赋给 lib_src 变量。 - add_library(lib ${lib_src})
add_library() 用于添加库,默认是静态库,这里接受两个变量,第一是库的名称 “lib” ,第二个是构成这个库的源文件(.c结尾),由于这个库只用到了 a.c 文件,所以可也写成 add_library(lib a.c),如果需要多个文件,例如a.c、b.c则可以写成add_library(lib a.c b.c)。
在本项目中,源文件通过 (3)赋给了变量${lib_src}. - target_include_directories(lib PUBLIC “./include”).
由于构建lib库需要的源文件a.c 需要include “a.h”,所以在这里添加头文件的搜索路径。
编译
依次运行:
mkdir build
cd build
cmake ..
make
查看build文件夹,发现有一个文件:
liblib.a
这就是编译出的静态库
test1项目目录结构##
test1/
|-- CMakeLists.txt
`-- main.c
main.c
#include <stdio.h>
#include "a.h"
int main()
{
int a,b,c;
a = 1;
b = 2;
c = add111(a, b);
printf("hello, world\n");
printf("c = %d\n", c);
return 0;
}
在main.c函数里,包含了lib1项目中的a.h头文件。
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(test)
find_library(Lib1 lib /root/lib1/build)
include_directories(/root/lib1/include)
add_executable(test main.c)
target_link_libraries(test ${Lib1})
CMakeLists中的内容上面已经解释过的这里不在解释。
- find_library(Lib1 lib /root/lib1/build).
用于寻找库,这个库就是上一章编译出的 liblib.a ,第一个参数Lib1指的是在本文件中,将找到的库赋给Lib这个变量,第二个参数lib指的是库的名称,因为在上一章 add_library(lib ${lib_src}) 将库命名为lib,所以第二个参数是lib,第三个参数表示这个库(liblib.a)所在的路径。 - include_directories(/root/lib1/include).
使用静态库,需要include对应的头文件,通过这行代码添加了头文件的搜索路径,从而可以找到"a.h"这个头文件。 - add_executable(test main.c).
用于添加可执行文件,用法类似于add_library,第一个参数表示可执行文件的名称,后面的参数表示可执行文件的源文件,注意,这里没有添加a.c,因为已经把a.c编译成了静态库,只需要连接这个静态库就好了。 - target_link_libraries(test ${Lib1}).
给这个可执行文件连接静态库,第一个参数代表可执行参数的名称,第二个是库的名称。
编译
依次运行:
mkdir build
cd build
cmake ..
make
查看build文件夹:
root@16d412456eae:~/test1/build# ls
CMakeCache.txt CMakeFiles Makefile cmake_install.cmake test
运行 test:
root@16d412456eae:~/test1/build# ./test
hello, world
c = 3
结果符合预期。