C语言函数静态库和动态库的创建和使用

转自:https://www.cnblogs.com/kmist/p/10088585.html

 

使用库函数是源码的一种保护???  <我猜的.>

库函数其实不是新鲜的东西,我们一直都在用,比如C库.

我们执行pringf() 这个函数的时候,就是调用C库的函数.

 

下面记录静态库和动态库的生成和使用.

 

静态库:libxxx.a

动态库:libxxx.so

 

静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的时候不需要外部函数库

动态库: 在程序运行的时候,将库加载到程序中,运行的时候需要外部函数库

函数库的目录有 /lib 和 /usr/lib 和 自定义

 

一. 静态库的生成和使用

下面通过一个简单的小栗子来介绍库函数怎么生成和使用.

1.库函数的源码 hello.c

#include "stdio.h"

int hello(void){
    printf("hello lib");  
    return 0;
}

2. 库函数的头文件 hello.h

#ifndef __HELLO_H
#define __HELLO_H

int hello(void);

#endif

库文件的头文件是库文件的目录,因为库文件是保护的,看不到里面的源码,所以把函数接口通过头文件来让人调用 .

这样就实现了接口,也保护了源码

3.编译静态库函数

3.1 将 hello.c 编译成目标文件 生成  hello.o文件

gcc -c hello.c

3.2 将.o文件打包成静态库 生成 libhello.a库文件

ar -cr libhello.a hello.o

4 使用静态库,因为静态库是在编译的时候一起打包进程序的,所以如果编译的时候没有静态库文件,则无法编译

4.1 main.c 写一个main函数来调用库函数

#include "hello.h"    //引入库函数的头文件,这样才能找到函数声明

int main{
  
  hello();        //调用库函数

}

正常编译的时候是没办法通过的. 因为编译器找不到 hello() 的实现代码. 如图:

 

所以在编译的时候要加入库引用(此时gcc编译时不能加参数-c)

gcc  main -L. -lhello -o a.out  

-L<路径> 引用自定义库的路径,如果调用系统库就不用-L  '.'表示当前文件夹 

-lxxxx 这里libhello.a 只要写hello 就可以   //小写的L

4.2 直接可以执行,因为库函数已经被编译进去了

 

gcc -c与gcc -o以及不加参数的区别

-c           编译和汇编,但不要链接。
-o <file>    将输出放入<文件>'无参数'      表示恢复为基于文件扩展名猜测语言的默认行为。

-llibrary 
制定编译的时候使用的库 例子用法
gcc -lcurses hello.c 使用 ncurses 库编译程序
 
-Ldir
制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个dir就是目录的名称。

1、通过gcc 不加参数可以一步直接编译生成可执行文件

gcc main.c

这里生成的是可执行文件a.out,当然可以通过-o选项更改生成文件的名字,比如将生成的可执行文件命名为hello.exe

posted @ 2024-07-04 15:10  小小仓鼠  阅读(43)  评论(0编辑  收藏  举报