C语言动态库libxxx.so的几种使用方法
首先先编写一个简单的函数func.h func.c
func.h
#ifndef _FUNC_H
#define _FUNC_H#include <stdio.h>
#include <stdlib.h>void fun(char *str);#endif
func.c
#include <func.h>void fun(char *str)
{printf("%s\n", str);}
将这个函数编译成动态库
$ gcc func.c -I . -shared -fPIC -o libfunc.so
$ ls
func.c* func.h* libfunc.so* main.c*
编写main.c程序
#include <func.h>int main(int argc, char *argv[])
{fun("Hello World!\n");return 0;
}
编译方法一:
$ gcc main.c -I . ./libfunc.so
$ ./a.exe
Hello World!
查看可执行文件依赖:
$ ldd a.exentdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x77d20000)KERNEL32.DLL => /cygdrive/c/Windows/System32/KERNEL32.DLL (0x779b0000)KERNEL32.DLL => /cygdrive/c/Windows/System32/KERNEL32.DLL (0x779b0000)KERNELBASE.dll => /cygdrive/c/Windows/System32/KERNELBASE.dll (0x74e40000)libfunc.so => /home/rongtao/libfunc.so (0x690c0000)cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
里面依赖的dll文件是因为我用的cywin,是windows下面的Linux仿真软件,所以会用到,我们主要关注这个libfunc.so库文件,关注它后面的路径,可以看到这个地方的路径即为编译时的路径。
我们再看看这个动态库内部的函数关系:
$ nm libfunc.so | grep T --color=auto
690c1690 T ___CTOR_LIST__
690c1104 T ___cxa_atexit
690c169c T ___DTOR_LIST__
690c10c0 T ___gcc_deregister_frame
690c1000 T ___gcc_register_frame
690c3264 R ___RUNTIME_PSEUDO_RELOC_LIST__
690c3264 R ___RUNTIME_PSEUDO_RELOC_LIST_END__
690c1690 T __CTOR_LIST__
690c12d0 T __cygwin_crt0_common@8
690c1150 T __cygwin_dll_entry@12
690c1250 T __cygwin_noncygwin_dll_entry@12
nm指令是查看库文件的声明、未声明的函数等作用。在编程过程中我们经常会遇到“未引用的定义”,这个其实就可以用nm命令查看。在这里我想说个题外话,消息队列的库是“-lrt”,之前编译的N多变没通过的原因就是没加这个库。
编译方法二:
如果我们把这个文件家内的libfunc.so文件删除,再运行可执行文件会出现如下错误:
$ ls
a.exe* func.c* func.h* main.c*$ ./a.exe
D:/Program Files (x86)/cygwin/home/rongtao/a.exe: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
无法加载动态库文件。
这里我用的cywin,所以说和一般的Linux系统不一样,没法演示,具体流程是:
如果系统是x86_64的,那么在/usr/lib64文件夹下为系统库,这个库是可以直接调用的(例如我们的-lm, -pthread,-lrt等),如果我们将动态库文件放到这个文件夹下就可以直接用“-lfunc”来调用。此处不做过多讲解。
C语言动态库libxxx.so的几种使用方法相关推荐
- c语言怎么调用sdl库函数,Go调用SDL2的C语言动态库
# Go调用SDL2的C语言动态库 在网上找到go的GUI项目基本都需要安装额外软件库,尝试了一下使用go调用dll库的,有所收获,抛砖引玉,留个记录怕以后忘了. ## 1.目录结构 ``` └─li ...
- Rust应用调用C语言动态库
外部功能接口FFI 虽然高级(脚本)编程语言的功能丰富,表达能力强,但对底层的一些特殊操作的支持并不完善,就需要以其他编程语言来实现.调用其他编程语言的接口,被称为Foreign Function I ...
- go语言调用c语言动态库及交叉编译
实现基础:CGO编程 C/C++经过几十年的发展,已经积累了庞大的软件资产,它们很多久经考验而且性能已经足够优化.Go语言必须能够站在C/C++这个巨人的肩膀之上,有了海量的C/C++软件资产兜底之后 ...
- go语言动态库的编译和使用
本文主要介绍go语言动态库的编译和使用方法,以linux平台为例,windows平台步骤一样,具体环境如下: $ echo $GOPATH /media/sf_share/git/go_practic ...
- C++动态库调用宿主进程中的对象方法《纯虚函数的使用》
可执行程序加载动态库并调用动态库导出的函数是比较容易的: 导入库对应的头文件 在CPP文件中调用函数 在链接程序时加上动态库作为参数 假设demo.cpp中需要用到动态库libadd.so中的某个函数 ...
- R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况
R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况 目录
- 使用jna调用c语言动态库对接华视电子身份证阅读机
一些C语言的接口见上一篇文章 同样把用到的动态库放到jdk的bin目录文件夹下 Termb.java import com.sun.jna.Library; import com.sun.jna.Na ...
- 使用jnative调用c语言动态库对接华视电子身份证阅读机
一 身份证阅读器SDK使用手册 1. 定义 应用函数开发包含下列文件: termb.dll API函数的动态联接库 sdtapi.dll 安全模块通讯函数 UnPack.dll 身份证相片解码库 适用 ...
- 编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式
后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序: 后缀为.cpp的,两者都会认为是c++程序. 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的. 编译阶段,g++会调用gc ...
最新文章
- SAP MM 中级之事务代码MICN的相关逻辑
- 自学python数据分析要多久-如果只有1小时学Python,看这篇就够了
- Python将是人工智能时代的最佳编程语言
- C# 两时间,时间间隔
- 巧用EditPlus包含VS2010网站项目资源
- SSH整合方案二(不带hibernate.cfg.xml)
- 解决Linux 忘记root 密码的办法
- mysql 主主忽略错误_MySQL 主主报错: Fatal error: The slave I/O thread stops because master and slave have...
- java能打开mob吗_使用 Java添加KeyMob手机聚合平台教程
- python字典的键有什么要求_在Python中使用范围作为字典键,我有什么选择?
- Java 中foreach 的用法
- wxPython色环电阻计算器
- PDF能编辑吗,PDF文件怎么拆分页面
- AWS Python应用
- 基于JSP实现医院病历管理系统,程序员如何在工作中自我增值
- 选取单元格区域和选中整个单元格的技巧:
- mysql 红黑树_微信大牛教你深入了解数据库索引
- Debug-PC之开山老祖[转]
- 域控中将计算机账户移动到特定OU下
- Visual Studio SVN创建分支 合并分支 切换分支 vs 插件 visualsvn
热门文章
- ParNew垃圾收集器
- CentOS7.5 Linux搭建全文检索--Solr7.4.0单机服务
- [leetcode]242. Valid Anagram判断两个字符串是不是包含相同字符的重排列
- 如鹏网学习笔记(十二)HTML5
- 关于 QImage::Format_Mono
- jgGrid常用操作--持续更新
- 王伟storm_王伟 - 南京大学 - 化学化工学院
- 单结晶体管的导电特性_适用于印刷电子的导电墨水可在纸和PET薄膜上印刷薄膜晶体管...
- jsp mysql更新表数据库_一个关于JSP更新数据库MySQL中的表的问题!
- python中字典类型中的item是什么-Python中的字典介绍