精华内容
下载资源
问答
  • 创建库文件c语言
    2021-05-20 17:56:47

    创建一个函数库

    上述程序中的rand和bubble_sort函数很实用,很可能在您写其他程序时也能派上用场。为了能更方便地重复使用,您可以为它们创建一个实用工具函数库。

    所有的函数库都包括两部分:头文件和源文件。头文件的标准扩展名是.h,它包含函数库的一些信息,使用这个库的程序需要知道这些信息。一般来说,头文件包括常数,类型声明以及该函数库所提供函数的原型声明。请将下面的头文件代码录入,以文件名util.h保存。

    /* util.h */

    extern int rand();

    extern void bubble_sort(int, int []);

    这两行是函数原型声明。C语言中用“extern”指明从外部链接的函数。使用旧式编译器时须将bubble_sort的参数列表清空。

    然后录入下面的代码,以文件名util.c保存。

    /* util.c */

    #include "util.h"

    int rand_seed=10;

    /* 摘自 K&R

    - 产生一个0至32767之间的随机数。*/

    int rand()

    {

    rand_seed = rand_seed * 1103515245 +12345;

    return (unsigned int)(rand_seed / 65536) % 32768;

    }

    void bubble_sort(int m,int a[])

    {int x,y,t; for (x=0; x < m-1; x++)

    for (y=0; y < m-x-1; y++)

    if (a[y] > a[y+1])

    {t=a[y]; a[y]=a[y+1]; a[y+1]=t; } }

    注意,本文件包含了自己的头文件(util.h)而且用的是引号而不是< >,因为尖括号只用于系统库。如您所见,这里的代码和普通C代码没什么区别。请注意,因为rand_seed变量没有在头文件中出现,所以对使用本库的程序来说是不可见的,也不能被修改。这就叫做信息隐藏。在int前面加上static关键字会强制信息被完全隐藏。

    请录入下面的主函数,以文件名main.c保存。

    #include #include "util.h"

    #define MAX 10

    int a[MAX];

    void main()

    { int i,t,x,y; /* 填充数组元素 */

    for (i=0; i < MAX; i++)

    {a[i]=rand(); printf("%dn",a[i]);}

    bubble_sort(MAX,a); /* 打印排序后的数组 */

    printf("--------------------n"); for (i=0; i < MAX; i++)

    printf("%dn",a[i]); }

    这个程序包含了该实用工具函数库。使用函数库的主要好处是主程序的代码被大大精简了。

    函数库的编译和运行

    要编译函数库,请在命令行键入如下命令(假设您使用的是UNIX。若您的系统用的是cc则用cc替换gcc):

    gcc -c -g util.c

    -c选项使编译器为函数库生成一个的目标文件,它包含了函数库的二进制代码,独立存在于名为util.o的目标文件中。目标文件只有在和一个包含主函数的程序文件链接后才能执行。

    要编译主程序,请键入:

    gcc -c -g main.c

    此命令将生成一个文件名为main.o的目标文件,它包含了主程序的二进制代码。要创建包含整个程序机器代码的可执行文件,请键入下面的命令将两个目标文件链接:

    gcc -o main main.o util.o

    这条命令将main.o和util.o进行链接并生成可执行程序main。键入main后即可运行。

    用makefile可以在一定程度上简化函数库的使用。

    更多相关内容
  • 包含用于轻松创建 websocket 服务器的功能。它实现了 websocket 协议 rfc6455。 特征 纯C。 它很小! 它很容易嵌入到任何平台上的任何应用程序中。 设计是在考虑微控制器架构的情况下进行的。 更多详情、...
  • C语言动态库创建及使用C语言调用的方式

    C语言动态库创建:

     1.创建空项目,项目“属性——配置属性——常规——配置类型“改为”动态库(.dll)

     2.创建头文件选择"头文件(.h)"

     3.头文件声明函数:

            注:可以在#define前写#ifndef和最后一行添加#endif来检查是否重名。演示这里偷懒就不加了。

     4.创建动态库源文件引用demodll.h并定义函数:

    如果没有引用头文件就无法生成(.lib)

    5.右键项目——生成!

    ———————————————————————————————————————————

     C语言调用程序创建及调用方法:

    1.创建空项目。

    如果项目仅本地运行只复制动态链接库的.lib到工程文件夹下。

    如果要不是则复制.lib     .h     .dll这三个文件到工程文件夹下。

    2.调用写法:

     3.右键项目"属性——链接器——输入——附加依赖项",添加复制过来的(.lib)文件。

    4.右键项目设为启动项

    展开全文
  • 一、什么是库 库也叫代码库,可以把一个些目标文件合并在一起方便使用。库是一个二进制可执行的文件,需要被载入到内存中才能使用...库文件后缀: windows linux 静态库 XXX.lb XXX.a 动态库 XXX.lld XXX.so

    一、什么是库

    库也叫代码库,可以把一个些目标文件合并在一起方便使用。库是一个二进制可执行的文件,需要被载入到内存中才能使用。windows和linux都有自己的库,两者是不兼容的。

    二、库的分类

    静态库: 在链接时把库的二进制指令复制到调用模块中。
    共享库(动态库): 会和调用者一起加载到内存,当执行调用语句时会从程序的调用位置跳转到共享库中运行,共享库要有执行权限。
    库文件后缀:

    windowslinux
    静态库XXX.lbXXX.a
    动态库XXX.lldXXX.so

    优缺点:
    静态库的优点:运行速度快,但维护麻烦,当静态库中的内容更新后需要重新编译程序,使用静态库编译出的可执行文件会比共享库的要大。
    共享库的优点:使用方便,共享库如果发生变化不需要重新编译程序,使用它编译出的可执行文件比使用静态库要小,运行速度要比使用静态库慢。

    三、静态库的创建和使用(Linux)

    1、创建静态库
    编辑静态库原码:vim .c/.h
    编译出目标文件:gcc -c xxx.c -> xxx.o
    把目标文件打包成静态库文件:ar -r libxxx.a x1.o x2.o ...
    ar 是一个专门控制静态库的命令
    -r 把目录文件合并成一个静态库,如果静态库文件已经存在则更新。
    -q 向静态库中添加目录文件
    -t 查看静态库中有哪些目标文件
    -d 从静态库中删除目标文件
    -x 把静态库展开为目标文件
    2、使用静态库

    1. 直接调用

      把共享库当作目标文件一样,与调用者的目标文件一起合并出可执行文件。

     gcc main.c libtools.a
    
    1. 通过gcc -L参数来指定库的路径
    gcc main.c -L../tools/ -ltools
    
    1. 通过设置LIBRARY_PATH环境变量来指定库的路径
    • 打开~/.bashrc文件 vim ~/.bashrc
    • 在末尾添加:export LIBRARY_PATH=$LIBRARY_PATH":/home/zhizhen/tools/"
    • 保存退出后,执行:source ~/.bashrc
    • gcc main.c -ltools 需要通过-l来指定库名

    四、共享库的创建和使用

    1、创建共享库
    编辑静态库原码:vim .c/.h
    编译出目标文件:gcc -c -fpic xxx.c -> xxx.o
    把目标文件打包成共享库:gcc -shared x1.o x2.o … -o libxxx.so
    -fpic编译出位置无关代码,在代码中使用相对地址,这样共享库就可以遇到内存的任何位置。
    2、使用共享库
    1、直接调用

    gcc main.c libcalc.so
    

    注意: 需要设置共享的加载路径,LD_LIBRARY_PATH
    2、通过设置LIBRARY_PATH环境变量来指定库的路径
    gcc main.c -lcalc 需要通过-l来指定库名
    注意: 如果静态库和共享库同时存在,优先使用共享库,通过-static可以指定使用静态库。
    3、通过gcc -L参数来指定库的路径

    gcc main.c -L./calc/ -lclac
    

    4、动态加载共享库

      #include <dlfcn.h>
        void *dlopen(const char *filename, int flag);
        功能:打开共享库
        filename:共享库的路径
        flag:打开方式
            RTLD_LAZY:延迟加载,使用到共享库时再加载
            RTLD_NOW:立即加载
        返回值:成功返回共享库的句柄,失败返回NULL
    
     void *dlsym(void *handle, const char *symbol);
        功能:通过函数名在共享库中获取函数指针
        handle:共享库的句柄
        symbol:函数名
        返回值:函数地址,失败返回NULL
    
      char *dlerror(void);
        功能:获取错误信息
    
    int dlclose(void *handle);
        功能:卸载共享库
        注意:编译时添加-ldl参数
    

    七、辅助工具
    nm: 查看目标文件、可执行文件、静态库、共享库文件的符号列表。
    ldd: 查看可执行文件依赖了哪些共享库
    strip: 删除目标文件、可执行文件、静态库、共享库文件中符号列表、调试信息,可以有效降低文件的大小。
    objdump: 可以显示二进制文件的汇编信息

    八、错误处理
    1、通过函数返回值表式错误
    1、返回值合法表示成功,非法表示失败。
    2、返回有效指针表示成功,返回NULL/0xFFFFFFFF 表示失败。
    3、成功返回0,失败返回-1。
    4、永远成功,如:printf

    九、环境变量表
    每个程序执行时都收到一张操作系统传递给的环境变量表,方便该程序了解当系统的环境配置,env命令可以在终端查看环境变量表。

    环境变量表是一个以NULL结尾的字符指针数数组。
    该表是系统环境变量的拷贝,程序对当前这张进行修改,并不影响操作系统。

    char *getenv(const char *name);
    功能:根据环境变量名获取环境变量的值
    
    int putenv(char *string);
    功能:name=value向环境变量表中添加环境变量,环境变量不存在则添加,存在则修改。
    返回值:0表示成功,非零表示失败
    注意:不会把字符串拷贝到环境变量表中,而是把字符串地址存储到数组中。
    
     int setenv(const char *name, const char *value, int overwrite);
        功能:以name,value的形式向环境变量表添加环境变量,如果环境变量不存在则直接添加,如果存在则根据overwrite参数进行修改。
    
       overwrite:
            零 环境变量已经存在则不修改
            非零 功能相当于putenv
        返回值:0表示成功,非零表示失败
    
     int unsetenv(const char *name);
        功能:删除环境变量
        返回值:0表示成功,非零表示失败
    
    int clearenv(void);
    功能:清空环境变量
    
    展开全文
  • 创建自己的函数

    千次阅读 2021-05-26 02:50:24
    Tips-1:Linux下的库文件命名有一个规定:必须以lib三个字母开头Tips-2:Linux标准系统库文件一般储存在/lib和/usr/lib目录中。静态函数库(Static Library)扩展名:libxxx.o特点:相对于动态函数库,利用静态函数库...

    根据函数库使用的类型可以把函数库分为两大类,即静态函数库(Static Library)和动态函数库(Dynamic Library)。

    Tips-1:Linux下的库文件命名有一个规定:必须以lib三个字母开头

    Tips-2:Linux标准系统库文件一般储存在/lib和/usr/lib目录中。

    静态函数库(Static Library)

    扩展名:libxxx.o

    特点:相对于动态函数库,利用静态函数库编译成的文件大小会相对大一些;编译成功的可执行文件可以独立执行,不需要再向外部要求读取函数库的内容。

    动态函数库(Dynamic Library)

    扩展名:libxxx.so

    特点:用动态函数库编译成的文件并不能独立执行,要依赖于系统的函数库,而且函数库的路径也不能改变。编译成的执行文件,在执行过程中会向系统读取函数库,并运行。

    制作自己的静态函数库与动态函数库

    1.作为测试,首先建立下面三个文件。

    /*hello.c*/

    #include

    void Hello(const char *pStr)

    {

    Printf(“%s/n”, pStr);

    }

    /*hello.h*/

    #ifndef __HELLO_H__

    #define __HELLO_H__

    void Hello(const char *pStr)

    #endif

    /*main.c*/

    #include “hello.h”

    int main()

    {

    Hello(“Hello World/n”);

    return 0;

    }

    2. 将hello.c编译成.o文件

    #gcc –c hello.c,生成hello.o编译文件。

    3. 由.o文件创建静态库

    静态文件名规范是以lib为前缀,紧接着跟静态库名,扩张名为.a

    #ar cvr libhello.a hello.o

    生成静态函数库libhello.a

    4. 在程序中使用静态函数库

    #gcc –o test main.c –L. –lmyhello

    gcc –L dir 在库文件的搜索列表中添加dir目录

    用-l来指定函数库时可以省去函数去前面lib三个字母。

    5. 用.o文件创建动态函数库

    #gcc –shared –fpic –o libhello.so hello.o

    6. 在程序中使用动态函数库

    #gcc –o test2 main.c –L. –lmhello

    编译成功执行test2

    #./test2,会看到

    ./test2: error while loading shared libraries: libhello.so,cannot open shared object file: No such file or directory

    错误原因是找不到动态库文件libhello.so

    因为程序在运行时,会在/usr/lib和/lib等目录下查找需要的动态库文件。

    解决方法:

    (1)       把库拷贝到/usr/lib和/lib目录下

    (2)       在LD_LIBRARY_PATH环境变量中加上库所在路径。例如动态库libhello.so在/usr/local/tmp/ctest目录下,以bash为例,

    使用命令: $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tmp/ctest

    (3)       修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾并用ldconfig更新。

    查看库中的符号

    有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。

    库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有三种,

    一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;

    一种是库中定义的函数,用T表示,这是最常见的;

    一种是“弱态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示.

    #nm libhello.so

    使用ldd命令查看hello依赖于哪些库

    #ldd test

    展开全文
  • STM8 微控制器的 C 库。目前我只有 stm8l152 用于测试。...我想用类似于 STM32 微控制器的libopencm3库的 API 创建库。 您可以使用SDCC为 STM8 控制器编译自己的项目, 并使用stm8flash实用程序对其进行闪存。
  • C语言最佳实践之库文件介绍(上)

    千次阅读 2022-05-22 22:56:06
    C语言库文件包括:std开头的标准库、assert断言、sys开头的系统库、string字符串、time时间、math数学运算、pthread线程等。其中,标准库有stdalign.h、stdarg.h、stdatomic.h、stdbool.h、stddef.h、stdint.h、...
  • 假设在math目录下已编辑好add.c sub.c div.c mul.c func_point.c文件,func_...  gcc -shared -o libmymath.so add.o sub.o mul.o div.o//创建共享mymath,添加add.o,sub.o,mul.o,div.o目标文件  sudo m
  • C语言-库文件与头文件

    千次阅读 2020-03-21 02:31:12
    1> 正在创建库 C:\Users\史文天\source\repos\Dll1\Debug\Dll1.lib 和对象 C:\Users\史文天\source\repos\Dll1\Debug\Dll1.exp 1>Dll1.vcxproj -> C:\Users\史文天\source\repos\Dll1\Debug\Dll1.dll ========== ...
  • 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld...
  • conf-c基于C语言的轻量级读取/创建配置文件的函数简介conf-c是使用c语言开发的读取/创建配置文件的函数,它的参数数据结构为CONF_VALUE *CONF_VALUE结构有两个参数,一个键key和一个字符数组valuekey为键,value...
  • [C语言]如何使用C语言创建题库,进行高效刷题?教你如何创建一个简易题库,进行高效刷题!!C语言博大精深,方便生活才是真;
  • C语言函数文件

    2021-05-25 01:50:18
    4.6.1程序文件的大小因为C语言允许分别编译,很自然就会提出这样的问题:一个文件的最适宜的规模是多大?这规模很重要,因为编译时间与被编译文件的大小直接相关。一般说来,链接处理的时间比编译处理的时间短得多,...
  • C语言文件生成静态lib

    千次阅读 2021-03-12 14:53:25
    最近看到一个模块的程序,在阅读的时候发现一个函数有引用,有声明,却找不到在哪里定义,模块只有头文件没有对应的.c文件,顿生疑惑,想着这程序怎么能运行呢。后来发现文件夹中有个后缀为.a的文件...
  • 假设在math目录下已编辑好add.c sub.c div.c mul.c func_...gcc -shared -o libmymath.so add.o sub.o mul.o div.o//创建共享mymath,添加add.o,sub.o,mul.o,div.o目标文件 sudo mv libmymath.so /usr/lib gcc fun
  • 初识C语言,如何创建第一个C语言项目,一步一步教你从创建项目,源文件,到打代码,编译代码,让你成功运行一个C语言
  • 功能:打开动态链接库文件 参数:filename 动态链接库文件名 flag 打开方式,一般为RTLD_LASY 返回值:库指针 函数:char *dlerror(void); 功能:获取错误值 返回值:错误值 函数:void *dlsym(void *handle,...
  • C语言常用

    千次阅读 2021-08-11 17:07:02
    koz.ross 维护的一个 C 语言资源列表,包括了:构建系统、编译器、数据库、加密、初中高的教程/指南、书籍、等等。 【特别提示】:伯乐在线已经在 GitHub 上发起了C 语言资源大全中文版的整理项目,链接:...
  • C语言创建和调用dll动态

    千次阅读 2021-12-10 19:58:08
    前言 C++在调用Dll中的函数的时候,如果是企业内部的话,肯定是希望三件套的方式(.h\.lib\.dll)。这样做的话,编写方可以在头文件中写入很...首先创建一个空的DLL文件创建方法:新建——项目——Win32控制台程序...
  • HMC5883L I2C 器件为 ARM 32 位 STM32F103xx 系列微控制器上的 HMC5883L I2C ...根据器件数据表中提供的信息,使用放置在每个定义文件中的 Doxygen 样式注释创建文档 更多详情、使用方法,请下载后阅读README.md文件
  • 书接上回---如何创建静态 此时我们拿到了静态和头文件了,将他放到我们代码的文件夹中 并在前面打上这句话 #pragma comment(lib,"文件名.lib") 由于我这个设计的是一个减法模块 最后运行结果 哈...
  • C语言 共享(动态)制作

    千次阅读 2020-08-30 21:40:56
    文章目录共享简介共享制作代码实现创建共享链接使用共享小结 共享简介 共享的本质就是将多个目标文件打包成一个文件。链接共享就是在可执行文件中调用共享中函数的指令处插入一些指令,在运行时通过...
  • C语言dll动态链接

    千次阅读 2022-04-20 21:09:55
    C语言dll动态链接 vs中dumpbin工具的使用 参考链接:https://blog.csdn.net/DoronLee/article/details/78284837   用vs生成的.obj文件、.lib、.dll动态链接、.exe执行文件,如果想查看其中这些文件...
  • C语言中的静态与动态

    千次阅读 2021-08-03 11:10:07
    在链接阶段,将汇编生成的目标文件.0与引用到的一起打包到可执行文件中,此种链接方式称为静态链接。 静态特点总结:  静态的链接是编译时期完成;  程序运行与函数再无瓜葛,移植方便;  浪费空间与...
  • Linux下的SFTP C语言客户端,包括SFTP下载、上传、list目录和创建目录,依赖libssh2,该可自行下载编译安装。 全部源代码,可编译和测试。
  • C语言中动态/静态创建和使用

    千次阅读 2020-07-03 16:57:20
    C语言程序在开发过程中通常会使用遇到动态或者是静态库函数的创建和使用,这里做简要的记录。 A.静态函数的创建 1.源文件getSum.c #include "getSum.h" int getSum( int a, int b ) { return a + b; } 2....
  • 下面我们将用两种不同的姿势来用VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件) 生成动态库文件 姿势一: 第一步:新建...
  • 文件代表一系列的字节。函数 fopen()将一个文件和一个流关联起来,并初始化一个类型为 FILE 的对象,该对象包含了控制该流的所有信息。这些信息包括指向缓冲区的指针;文件位置指示器,它指定了获取文件的位置;以及...
  • 基于c语言实现socket文件传输

    千次阅读 2021-06-05 16:03:59
    c语言实现基于socket的文件传输,从server传输到client。
  • 第一部分:创建动态dll。 1、打开visual studio 创建一个控制台应用程序。 2、选择DLL,空项目。 3、点击源文件,创建一个main.c文件 4、在main.c中写入一个简单的函数,内容如下: __declspec(dllexport) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,965
精华内容 47,586
关键字:

创建库文件c语言