C语言学习笔记 库文件

文章目录

概述

在C语言中,库分为静态库(.a)和动态库(.dll或.so)。

调用静态库时,编译器会把库文件编译到可执行文件(.exe)里;

调用动态库时,编译器不会把库文件编译到可执行文件(.exe)里,需要同可执行文件放到同一目录,程序运行时才会调用。

生成静态库及应用

  • 在工作区,按住shift右击选择:在此处打开命令窗口,创建项目目录:

    mkdir test_create_libs
    cd test_create_libs

  • 创建程序入口文件:

    ···

    notepad main.c

    ···

  • 写入:

    ···

    #include <stdio.h>

    int main(int arg,char *argv[])

    {

    printf("Hello World!");

    return 0;

    }

    ···

  • 创建运行脚本:

    ···

    notepad run.cmd

    ···

    写入:

    gcc -o main main.c
    main
    pause

*** 到此,双击notepad run.cmd就得到了一个 Hello World。

  • 创建一个测试用的头文件:

    mkdir include
    notepad include/mylib.h

写入:

复制代码
#if !defined(MYLIB_H)
#define MYLIB_H

void mylib_print();

#endif // MYLIB_H

创建一个实现的源文件:

···

mkdir src

notepad src/mylib.c

···

写入:

复制代码
#include "../include/mylib.h"
#include <stdio.h>

void mylib_print(){
    printf("Hello @ mylib");
}

修改入口文件:

···

notepad main.c

···

修改为:

···

#include <stdio.h>

#include "include/mylib.h"

int (int arg,char *argv[])

{

printf("Hello World @main.c\n");

mylib_print();

return 0;

}

···

  • 键入命令调试:
    ···
    gcc -o main main.c src/mylib.c
    main
    ···
    *** 到此,就得到了一个调用其他源文件的程序。

*** #include ".../include/mylib.h" 双引号表示引入本项目的头文件;

#include <stdio.h> 尖括号表示引入编译器里的头文件,可以把第三方的头文件和库文件分别复制到编译器里的include和lib文件夹,伪装成编译器的标准头文件。

  • 将C源文件编译为对象文件。使用 -c 选项告诉GCC只编译不链接。

    gcc -c -fPIC src/mylib.c -o mylib.o

  • 使用 ar 命令将对象文件打包成静态库。

    ar rcs libmylib.a mylib.o

  • 编译时链接库,而不是src/mylib.c。

    gcc -o main main.c -L. -lmylib

  • 键入命令调试:
    ···
    main
    ···

*** 到此,就得到了一个调用其他静态库的程序。

*** libmylib.a要同mylib.h一起使用,并且要在源代码中引入:

复制代码
#include "mylib.h"

*** 这里 -L. 表示在当前目录(.)中查找库,-lmylib告诉链接器链接libmylib.a(注意在 -l 选项中省略了 lib 前缀和 .a 后缀)

等同于:

复制代码
gcc -o main main.c -L. libmylib.a

生成动态库及应用

在Windows上:

编译源文件为DLL

bash 复制代码
gcc -shared -o libmydll.dll src/mylib.c

在Unix-like系统上:

编译源文件为共享对象

bash 复制代码
gcc -shared -fPIC -o libmydll.so src/mylib.c
  • 键入命令调试:
    ···
    gcc -o main main.c -L. -lmydll
    main
    ···

*** 到此,就得到了一个调用其他动态库的程序。

*** 动态库文件需要同可执行文件放到同一目录。

相关推荐
CCCC13101632 小时前
嵌入式学习(day 28)线程
jvm·学习
星星火柴9363 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
小狗爱吃黄桃罐头3 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
艾莉丝努力练剑4 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
武昌库里写JAVA5 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
Cx330❀5 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
杜子不疼.6 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
小幽余生不加糖6 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频
..过云雨7 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
myzzb7 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa