-
2019-05-30 18:56:51
比如 log.h log.c
其中log.h 就几个函数的定义,用到的头文件很少。
但是log.c文件里面会有很多函数的实现,用到比如
#include <string.h>
#include <time.h>
#include <limits.h>
#include <signal.h>#include <unistd.h>
#include <dirent.h>
#include <stdlib.h>
#include <stddef.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>这些头文件最好不要放到头文件里面,而是放进log.c文件里面。
更多相关内容 -
SQLite3库文件,静态库,动态库,头文件
2019-07-22 18:42:22SQLite3一整套库,包括了头文件,拿来就能用,无需安装,直接添加到工程里 -
动态链接库及头文件
2019-06-19 13:08:58动态链接库及头文件 -
编译好的quazip库及头文件
2020-10-21 18:22:21编译好的quazip库及头文件,直接将两个文件夹添加到工程路径中,然后配置工程的包含其库及头文件目录,在所需的.h或.cpp中引用就行 -
GLM动态库、静态库和头文件(OpenGL)
2019-04-24 16:32:56利用CMake编译好的GLM库,包括静态库、动态库和头文件。可以直接在VS中使用,我测试的环境是win10+VS2015(win32/debug)。 -
x264源代码+编译脚本+动态库+静态库+头文件.zip
2021-08-10 09:14:47x264源代码+编译脚本+动态库+静态库+头文件,打包下载,包括armv7a和x86两种架构 想自己编译的可以参考博客:https://hellogoogle.blog.csdn.net/article/details/119561028 -
openssl-1.0.2p 编译好的静态库动态库头文件.rar
2021-09-04 16:24:531.适配openssl-1.0.2p qt5.12.2+vs2015的 https网页爬取测试; 2.编译麻烦; -
没有头文件,动态加载so 并使用里面中的方法
2021-12-05 16:19:12动态加载so在开发过程中,只有so库但是没有函数引用的头文件,但是又想调用里面的方法,因此,可以动态加载so,进行调so中的方法。具体步骤如下:
1.创建add.c文件
vim add.c
int add(int a,int b) { return a+b; }
2.生产动态库
在add.c的目录下,执行命令,后会生成 libadd.so
-fPIC 生成 PIC 代码,.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接
-shared 动态库
-o 生成目标的文件名gcc -shared -fPIC add.c -o libadd.so
3.编写调用so函数
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> typedef int (*Add)(int,int); int main() { //RTLD_NOW:在dlopen返回前,解析出全部没有定义的符号,解析不出来返回NULL。 //RT_GLOBAL:动态库定义的符号可被其后打开的其他库解析。 //RT_LOCAL:和上面相反,不能被其他库解析。默认。 //RTLD_LAZY:暂缓决定,等有需要时再解出符号 void *handle=dlopen("./libadd.so",RTLD_LAZY); Add add=NULL; *(void **)(&add)=dlsym(handle,"add"); int result=add(1,2); printf("1 + 2 = %d \n",result); return 0; }
4.编译生成可执行文件
在main.c的目录下,执行命令,后会生成 main 可执行文件
-rdynamic 生成可执行文件
-o 目标文件名gcc -rdynamic -o main main.c -ldl
5.测试
./main
输出结果:
1+ 2 =3 -
libfaac源代码+编译脚本+静态库+动态库+头文件.zip
2021-08-09 12:51:38libfaac源代码+编译脚本+静态库+动态库+头文件 完整用法请参照博客:https://hellogoogle.blog.csdn.net/article/details/119531649 -
openSSL头文件和静态库文件以及动态库
2018-08-26 10:59:56win10编译crtmpserver的依赖库OpenSSL的头文件和静态库文件 -
FFmpeg4.0_android版动态库和头文件.zip
2019-12-12 20:56:07此资源为FFmpeg4.0编译好的Android版动态库。可以在ndk项目中引入使用开发音视频或者练习ffmpeg开发技术 -
可以直接在vs中进行配置使用的opencv头文件以及动态库
2020-08-12 16:01:57该opencv动态库支持所有有关于opencv相关的技术,可以直接放在vs中,进行相关vs的环境配置之后,直接使用! -
FFmpeg的so动态库,头文件,源码
2017-08-16 17:57:48FFmpeg的so动态库,头文件,源码,直接下载可以使用,不用自己编译 -
C的常用模板函数接口 --对应的动态库和头文件
2018-08-28 09:57:54C的常用模板函数接口 --字符串操作、排序等字符串和排序算法用到的动态库linxiyuan.so和头文件xy_string_code.h、xy_sort_code.h。 -
头文件+源文件、动态库和静态库、宏定义
2022-04-22 15:32:26关于静态库与动态库的作用与用法前言
先导问题
- 如果一个函数在多个文件中同时使用,怎么办?
- 在程序设计中如何避免重复造轮子?
解决方案
- 头文件+源文件,将不同文件的函数引用到当前文件;
- 库文件,通过规范的代码编写成特定的库,以便后续调用;
- 宏定义,通过文本替换来定义简单的函数或变量。
编译过程
宏定义
在预处理阶段,是编译器对文本的替换。
对比头文件+源文件与库文件
头文件+源文件
- 编译前是人类可读的,即源代码;
- 在编译过程中的使用位置:在编译中使用;
- 来源:人手动编写的;
- 文件类型:C++中是
.cpp
和.hpp
文件。
库文件
库是一种可执行代码的二进制形式,已经写好、适用成熟、在遵守相关协议下可以复用被操作系统载入内存中执行的代码。
- 编译后是机器可读的,即二进制文件;
- 在编译过程中的使用位置:在链接中使用;
- 来源:人手动编写后经过编译生成的;
- 文件类型:C++中是
.so
,.ko
,.a
文件。
共同点
- 虽然没有规定调用库函数必须引用头文件,但一般约定,当调用库函数的时候需要引用接口函数所在的头文件;
- 一个库文件均有一组头文件与其对应。
链接
链接过程是将链接控制文件、命令行参数、对象文件与库文件融合的过程。库文件
库文件分为两种:动态库(共享库)和静态库
动态库
- 链接的时候不放入库文件,而是运行的过程中通过映射调用;
- 运行速度慢;
- 生成的目标文件需要在对应的动态库存在的时候才能运行;
- 目标文件小;
静态库
- 链接的时候将
.o
文件直接放入函数应该在的位置; - 运行速度快;
- 生成一个目标文件;
- 目标文件大;
Linux下几种库文件
.so
文件:shared object
.so
文件是用户层的动态链接库,用于用户层的动态链接使用,内核态的代码同样不能直接访问。.ko
文件:kernel object
.ko
文件是内核态的动态链接库,用于内核态的动态链接使用,可以用于内核之间的模块相互调用。用户态的代码不可直接调用内核态的代码,但是可以通过其他方式进行通信。.a
文件:archive
.a
文件是用于静态链接时,使用的静态库。.o
文件:object
.o
文件是编译生成的目标文件,.a
文件就是由.o
文件打包生成的。
Linux环境中实例
文件名:
test.c
#include <stdio.h> int testfunc(void) { puts("I'm so file."); return 123; }
文件名:
test.h
#ifndef SO_TEST #define SO_TEST int testfunc(void); #endif
文件名:
mytest.c
#include <stdio.h> #include "test.h" int main() { printf("%d\n", testfunc()); return 0; }
在Linux终端中输入
gcc test.c -fPIC -shared -o libtest.so sudo link libtest.so /usr/lib/libtest.so gcc mytest.c -L . -l test -o mytest
说明
- 默认程序运行的时候会在/usr/lib下寻找库;
- 一种是通过软链接将库链接到/usr/lib下;
- 另一种是修改PATH和 LD_LIBRARY_PATH,PATH是命令的环境变量,LD_LIBRARY_PATH是库的环境变量。详见Makefile与bash一文。
- gcc test.c -fPIC -shared -o libtest.so
-fPIC:位置无关代码(Position Independent Code, PIC)
-shared:告诉编译器这是要编译动态链接库
编译最终的命名规则是以lib开头的,即libxxx.so - gcc mytest.c -L . -l test -o mytest
-L:寻找库的目录,.是当前目录
-l:(小L)要链接的库 - 注意与-I的区分,因为很多时候很难分得清大i还是小L(当然还有数字1)
-
Windows下32位的FFMPEG4.2.2的库,包括编译运行库和头文件
2020-06-28 14:52:27在Windows下使用的32位ffmpeg4.2.2的库,包括编译运行库和头文件。 使用方法参考: https://blog.csdn.net/xiaolong1126626497/article/details/105446935 -
编译好的QFtp库包括头文件静态库和动态库
2020-11-19 22:19:38编译好的QFtp库,包括头文件.h和静态库文件lib已经dll动态库文件,绝对可以使用,还包含有QFtp库的使用文档,自己总结的 -
JRTPLIB动态库包含头文件
2016-11-21 21:33:54JRTPLIB动态库包含头文件,Window下32位编译,直接可以用,QT支持 -
动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 ...
2021-12-05 23:03:43一、在 Visual Studio 2019 中创建 " 控制台应用 " 程序、 二、拷贝 xxx.lib、xxx.dll、xxx.h 到源码路径、 三、导入 xxx.h 头文件、 四、配置动态库引用、 五、调用动态库中的函数、文章目录
一、在 Visual Studio 2019 中创建 " 控制台应用 " 程序
欢迎界面中 , 选择 " 创建新项目 " ,
选择创建 " 控制台应用 " 项目类型 ,
配置 项目名称 与 位置 ,
项目创建完成后 , 初始程序是 C++ 程序 , 这里修改为 C 语言程序 ;
二、拷贝 xxx.lib、xxx.dll、xxx.h 到源码路径
将 动态库的 描述文件 xxx.lib , 动态库文件 xxx.dll , 动态库头文件 xxx.h , 拷贝到 项目的源码路径中 , 注意就是主函数源码所在的目录 ;
三、导入 xxx.h 头文件
在 " 解决方案资源管理器 " 中 , 右键点击 " 源文件 " , 选择 " 添加 -> 现有项 " 选项 ,
在弹出的对话框中 , 选择拷贝过来的 xxx.h 头文件 ;
此处 xxx.h 头文件 出现在 源文件 中 ;
将 xxx.h 头文件手动拖动到 " 头文件 " 中 ;
四、配置动态库引用
右键点击 " 解决方案 " , 在弹出的菜单中 , 选择 " 属性 " ,
选择 " 配置属性 -> 链接器 -> 输入 -> 附加依赖项 " 的 " 编辑 " 选项 ,
将 xxx.lib 选项 , 拷贝到此处 ;
五、调用动态库中的函数
导入头文件 , 即可调用动态库中的函数 ;
-
请问qt链接动态库和头文件相关的问题
2019-08-15 15:07:25.pro文件内加上了需要的LIBS和HEADERS,在usr/lib下也添加了需要的lib文件,但现在运行起来会报“unknown type name 'XXX'”,"use of undeclared identifier 'XXX'"这些好像是在说没找到头文件的报错。。。 请问... -
qrencode模块所需动态库静态库与头文件
2021-02-06 14:31:40qrencode模块所需动态库静态库与头文件 -
libcurl windows版本静态库 动态库 头文件
2017-06-05 20:52:10libcurl -
字体库ft2.9的静态库和动态库,还有头文件
2018-01-19 09:44:20在使用的时候要记得添加头文件,文本函数里放这两个#include "ft2build.h" #include FT_FREETYPE_H 头文件就行了,好好使用吧。 -
SQlite3库及头文件分享
2016-02-26 15:58:32文件列表:1)sqlite3.h;...但是按照一些描述步骤总是生成失败,下面的资源是已经生成好的SQlite库及头文件,可以拿过来直接用,我的几个项目都是使用该库及头文件来完成的,具体的使用方法可以参考本人写的微博内容。 -
zeromq-4.2.2动态库及头文件 vs2008版本
2018-01-29 15:20:28C++ zeromq开发必备的动态库及头文件:zmq.h、zmq.hpp、zmq_addon.hpp、zmq_utils.h、libzmq.lib、libzmq.dll -
头文件和库文件区别,动态库和静态库的区别,动静态库的生成
2020-05-18 15:24:53三、为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明的函数呢?动静态库区别1.可执行文件大小不一样2.占用磁盘大小不一样3.拓展性与兼容性不一样4.依赖不一样5.复杂性不一样6.加载速度... -
gdal_32+64位动态库+静态库+头文件
2017-06-11 20:52:34gdal-1.11.2版本的,采用vs2013编译的32+64位动态库+静态库+头文件 -
Pthread 多线程C++动态库+静态库+头文件
2018-02-23 17:19:46好用的c++多线程软件 Pthread visual studio可用,mfc可用 -
MC_dll.h关于matlab与C语言之间的动态链接库头文件
2021-10-21 16:12:29MC_dll.h关于matlab与C语言之间的动态链接库头文件 -
创建静态库/动态库一定要有头文件吗?为什么?
2020-12-03 14:49:02动态库:[Windows 下 .dll,Linux 下 .so] 之外, 必须提供头文件。头文件是你这个库里面提供了那些接口可以供外界使用。 如果没有头文件,其他人无法使用,因为不知道函数方法的原型! 2、在为某些软件项目写插件,而...