首页 > 其他分享 >C语言函数静态库和动态库的创建和使用

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

时间:2024-07-04 15:22:23浏览次数:13  
标签:文件 gcc 函数 静态 C语言 编译 hello 库函数

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

库函数其实不是新鲜的东西,我们一直都在用,比如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>    将输出放入<文件>。
'无参数'      表示恢复为基于文件扩展名猜测语言的默认行为。

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

gcc main.c

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

标签:文件,gcc,函数,静态,C语言,编译,hello,库函数
From: https://www.cnblogs.com/y593216/p/18283891

相关文章

  • 优化代码以避免 ESLint 的 array-callback-return 错误,需要确保 map 函数中的每个回调
    要优化这段代码以避免ESLint的array-callback-return错误,你需要确保map函数中的每个回调都返回一个值或者通过早期返回来处理。在你的例子中,你只在满足特定条件时返回元素。ESLint的规则要求每个数组迭代都应有返回值,否则它会抛出警告。一种解决方案是在不满足任何条件......
  • 在calculate函数中用 ALL( 'Dim_Calendar' )
    Axis_X_SM_Tgt=VARSele_Month=SELECTEDVALUE('Axis_X_Dec375'[Sort])VARSele_Year=MAX('Dim_Calendar'[CalendarYear])RETURNSWITCH(SELECTEDVALUE('Axis_X_Dec375'[Sort]),13,[D_3.75_Y_SM_Tgt],CALCUL......
  • 函数栈帧(下)
    一函数栈帧的创建我们首先来一步步解析上一篇文章的汇编代码00BE1820pushebp//把ebp寄存器中的值进行压栈,此时的ebp中存放的是invoke_main函数栈帧的ebp,esp-400BE1821movebp,esp//move指令会把esp的值存放到ebp中,相当于产生了main函数的ebp,这......
  • 【Elasticsearch】Elasticsearch动态映射与静态映射详解
    文章目录......
  • Go语言--自定义函数
    定义格式函数构成代码执行的逻辑结构。在Go语言中,兩数的基本组成为:关键字func、函数名、参数列表、返回值、所数体和返回语句。函数定义说明:func:函数由关键字func开始声明FuncName:函数名称,根据约定,数名首字母小写即为private,大写即为public.参数列表:函数可以有0......
  • MySQL 函数简介
    MySQL提供了丰富的函数,以下是一些常见的类型和示例:数学函数:**1.ABS(x):返回x的绝对值。示例:selectABS(-89);**2.CEIL(x):返回大于或等于x的最小整数。示例:selectCEIL(-89);**3.FLOOR(x):返回小于或等于x的最大整数。示例:selectFLOOR(-89);**4.RAND......
  • 【C语言小知识】备选拼写:iso646.h头文件
    备选拼写:iso646.h头文件C语言中有3种逻辑运算符:逻辑运算符含义&&与||或!非假设exp1和exp2是俩个简单的关系表达式,那么当且仅当exp1和exp2都为真时,exp1&&exp2才为真。如果exp1或exp2为真,则exp1||exp2为真。如果exp1为假,则!exp为真;如果exp1为真,则!exp为假。i......
  • EXCEL中20个数据处理类函数公式应用实例
    在Excel中,数据处理类函数是进行数据分析和报告制作的重要工具。以下列举了另外20个数据处理类函数及其应用实例,这些函数涵盖了一系列高级的数据处理需求,包括统计分析、财务计算、工程计算以及更复杂的文本和日期时间操作。数据统计与分析STDEV.S函数:用于计算样本标准差。例......
  • printf函数与cout函数的优缺点
    printf和cout均是C/C++中常用的两种输出方式一、printf优点:1.灵活的格式化:printf提供了丰富的格式化选项,如宽度、填充字符、对齐等。2.适用于多种数据类型:printf可以输出各种内置数据类型,如整数、浮点数、字符等。3.易于理解:对于有经验的程序员来说,printf的语法和格......
  • Python从入门到放弃——深入研究Print函数
    深入浅出Print函数第一个代码“HelloWorld”在正常配置了PyCharm或者Thonny等编辑器之后,我们开始写第一个代码。正常的情况下学习一门编程语言,一般第一个代码都是输出HelloWorld。那么如何打印HelloWorld呢?print("HelloWorld")然后我们运行程序就可以看到交互窗中......