使用CMake将代码编译成静态库,并在另一个项目使用它

使用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的具体解释:

  1. cmake_minimum_required(VERSION 3.16)
    指定对cmake的版本要求
  2. project(lib1)
    指定项目名称
  3. file(GLOB lib_src “./src/*.c”)
    通过GLOB将src文件夹所有以 .c 结尾的文件赋给 lib_src 变量。
  4. 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}.
  5. 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中的内容上面已经解释过的这里不在解释。

  1. find_library(Lib1 lib /root/lib1/build).
    用于寻找库,这个库就是上一章编译出的 liblib.a ,第一个参数Lib1指的是在本文件中,将找到的库赋给Lib这个变量,第二个参数lib指的是库的名称,因为在上一章 add_library(lib ${lib_src}) 将库命名为lib,所以第二个参数是lib,第三个参数表示这个库(liblib.a)所在的路径。
  2. include_directories(/root/lib1/include).
    使用静态库,需要include对应的头文件,通过这行代码添加了头文件的搜索路径,从而可以找到"a.h"这个头文件。
  3. add_executable(test main.c).
    用于添加可执行文件,用法类似于add_library,第一个参数表示可执行文件的名称,后面的参数表示可执行文件的源文件,注意,这里没有添加a.c,因为已经把a.c编译成了静态库,只需要连接这个静态库就好了。
  4. 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

结果符合预期。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值