一、CLion 制作静态库

新建静态库

编写源代码,使用的还是之前的源代码文件:

需要注意的是,CmakeLists.txt 配置内容

cmake_minimum_required(VERSION 3.14)
project(my_static_lib C)

set(CMAKE_C_STANDARD 99)

add_library(my_static_lib mul_div.c add_sub.c caculate.h)

Cmake的用法,具体查看Cmake相关资料,这里不再阐述

到此,直接编译项目,
在目录D:\study\C\library\my_static_lib\cmake-build-debug生成静态库文件:

libmy_static_lib.a # 就是我们的静态库文件

二、CLion 使用静态库

直接新建C工程项目,编写main.c源码文件

#include <stdio.h>
#include "../my_static_lib/caculate.h"  //包含静态库的头文件

int main(void)
{
    double a = 10.5;
    double b = 20.6;
    double ret = 0;

    ret = add(a, b); //加
    printf("add: ret = %f\n", ret);

    ret = sub(a, b); //减
    printf("sub: ret = %f\n", ret);

    ret = mul(a, b); //乘
    printf("mul: ret = %f\n", ret);

    ret = div1(a, b); //除
    printf("div: ret = %f\n", ret);

    ret = power(a);
    printf("power: ret = %f\n", ret);

    return 0;
}

配置 CMakeLists.txt 方式1:

cmake_minimum_required(VERSION 3.14)
project(test_static C)

set(CMAKE_C_STANDARD 99)

include_directories("D:/study/C/library/my_static_lib") #头文件目录

# 它相当于gcc 命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64
link_directories("D:/study/C/library/my_static_lib/cmake-build-debug")

add_executable("test_static" "main.c")

# 这个要写在add_executable后面;设置要链接的库文件的名称
target_link_libraries("test_static" "libmy_static_lib.a")

配置 CMakeLists.txt 方式2:

cmake_minimum_required(VERSION 3.14)
project(test_static C)

set(CMAKE_C_STANDARD 99)

# include_directories() 头文件目录

# 直接指定链接的库文件;多个可以写多行,也可以用空格隔开写多个
link_libraries("D:/study/C/library/my_static_lib/cmake-build-debug/libmy_static_lib.a")

add_executable(test_static main.c)

配置好直接编译运行即可


三、CLion 制作、使用动态库介绍

1. 制作动态库

新建项目同上,主要看下 CMakeLists.txt 文件的配置

cmake_minimum_required(VERSION 3.14)
project(my_shared_lib C)

set(CMAKE_C_STANDARD 99)

add_library(my_shared_lib SHARED add_sub.c mul_div.c caculate.h)

2. 使用动态库

新建项目同上,主要看下 CMakeLists.txt 文件的配置

cmake_minimum_required(VERSION 3.14)
project(test_shared C)

set(CMAKE_C_STANDARD 99)

link_directories("D:/study/C/library/my_shared_lib/cmake-build-debug")

add_executable(test_shared main.c)

# 这个要写在add_executable后面;设置要链接的库文件的名称
target_link_libraries("test_shared" "libmy_shared_lib.dll.a")

编译得到exe文件后,需要将前面生成的动态库文件libmy_shared_lib.dll放在exe文件同目录下才能运行


四、VC++ 制作、使用静态库、动态库介绍

我们这里只是大概的介绍一下,具体的实现请大家查阅资料完成,不过目前大家没有必要去深究,以后碰到时在深究也不晚

VC++是微软推出的IDE,所使用的编译器自然为Windows编译器,开发的程序基本都是针对Windows平台的

制作静态库

使用VC++所制作的静态库为***.lib,显然Windows编译器所制作的静态库的名字,尾缀为.lib

制作动态库

  • 1)真正动态库:***.dll
  • 2)动态库引导文件:***.lib,不再是gcc下的.a

虽然制作库的原理都差不多的,但是VC++codeblocksCLion 等毕竟是完全不同的IDE
而且各自使用的“编译器”也不相同,因此制作库的细节会有差异,那么像这些有差异东西,我们就不可能一一讲到

这些东西只能由大家在工作中碰到后自行解决,我的建议是碰到后在解决,没有碰到时就不要去关心了,
毕竟我们的时间是很宝贵的,划清工作和学习的重点是很重要的

不过有一点需要说明一下,Codeblocks制作的静态库为***.a,如果想要拿到VC++上使用的的话,
需要用工具软件转为***.lib,同样的***.a动态库引导文件也需要被转为***.lib动态库引导文件


五、静态、动态库额外介绍

1. 库的头文件

对于很重要的库来说,OS或者编译器会自动帮我们提供库所需的.hinclude时会自动找到这些.h文件,
对于一般的库(私人库、公司库)来说,OS和编译器是不可能帮我们提供这些头文件的,我们需要自己添加,
至于如何添加,在前面的课程中已经介绍过了

2. 再说说静态库和动态库

(1)静态库

链接静态库后,程序中就会包含所需的代码,编译链接之后,静态库对于我的程序来说就没有意义了

(2)动态库

链接动态库时只是留了个接口,程序运行时需要单独的加载动态库

  • 1)对于重要的动态库来说,比如C标准库的动态库,各个平台都会支持,在我们的程序包中不需要包含动态库
  • 2)对于自己库、公司库来说,平台是不可能提供的,所以我们做好动态库后,需要把动态库和可执行程序打包放到一起,
    将动态库和可执行程序一起发布,只有这样运行程序时才能找到并加载动态库

3. C 库函数与 OS API 的关系

如果C库基于OS运行的话,C库函数与OS API的关系如下:
我们以WindowsLinux为例:

C标准库   W平台C库                 C标准库   L平台C库
     \   /                             \   /
      API                               API
    Windows                            Linux

基于OS运行时,C库函数会调用OS API,也就是说C库函数会对OS API做封装,
比如printf函数向下调用时,封装OS APIwrite函数,write在调用底层LCD驱动,将数据输出LCD硬件上显示

C库函数是不是一定会调用OS API呢?

答:当然不是,有两种情况不会:

  • 1)不需要OS API的支持,那么这个C库函数就不需要调用OS API
    比如strlenstrcpy函数,只是非常简单的字符串操作函数,不需要OS API的支持,
    大家其实也能写出这两个函数,最多就是代码不如别人规范而已
  • 2)裸机的C库不会调用OS API,因为裸机时是没有OS的,所以裸机C库与OS API是没有任何关系的