首先先编写一个简单的函数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的几种使用方法相关推荐

  1. c语言怎么调用sdl库函数,Go调用SDL2的C语言动态库

    # Go调用SDL2的C语言动态库 在网上找到go的GUI项目基本都需要安装额外软件库,尝试了一下使用go调用dll库的,有所收获,抛砖引玉,留个记录怕以后忘了. ## 1.目录结构 ``` └─li ...

  2. Rust应用调用C语言动态库

    外部功能接口FFI 虽然高级(脚本)编程语言的功能丰富,表达能力强,但对底层的一些特殊操作的支持并不完善,就需要以其他编程语言来实现.调用其他编程语言的接口,被称为Foreign Function I ...

  3. go语言调用c语言动态库及交叉编译

    实现基础:CGO编程 C/C++经过几十年的发展,已经积累了庞大的软件资产,它们很多久经考验而且性能已经足够优化.Go语言必须能够站在C/C++这个巨人的肩膀之上,有了海量的C/C++软件资产兜底之后 ...

  4. go语言动态库的编译和使用

    本文主要介绍go语言动态库的编译和使用方法,以linux平台为例,windows平台步骤一样,具体环境如下: $ echo $GOPATH /media/sf_share/git/go_practic ...

  5. C++动态库调用宿主进程中的对象方法《纯虚函数的使用》

    可执行程序加载动态库并调用动态库导出的函数是比较容易的: 导入库对应的头文件 在CPP文件中调用函数 在链接程序时加上动态库作为参数 假设demo.cpp中需要用到动态库libadd.so中的某个函数 ...

  6. R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况

    R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况 目录

  7. 使用jna调用c语言动态库对接华视电子身份证阅读机

    一些C语言的接口见上一篇文章 同样把用到的动态库放到jdk的bin目录文件夹下 Termb.java import com.sun.jna.Library; import com.sun.jna.Na ...

  8. 使用jnative调用c语言动态库对接华视电子身份证阅读机

    一 身份证阅读器SDK使用手册 1. 定义 应用函数开发包含下列文件: termb.dll API函数的动态联接库 sdtapi.dll 安全模块通讯函数 UnPack.dll 身份证相片解码库 适用 ...

  9. 编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式

    后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序: 后缀为.cpp的,两者都会认为是c++程序. 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的. 编译阶段,g++会调用gc ...

最新文章

  1. SAP MM 中级之事务代码MICN的相关逻辑
  2. 自学python数据分析要多久-如果只有1小时学Python,看这篇就够了
  3. Python将是人工智能时代的最佳编程语言
  4. C# 两时间,时间间隔
  5. 巧用EditPlus包含VS2010网站项目资源
  6. SSH整合方案二(不带hibernate.cfg.xml)
  7. 解决Linux 忘记root 密码的办法
  8. mysql 主主忽略错误_MySQL 主主报错: Fatal error: The slave I/O thread stops because master and slave have...
  9. java能打开mob吗_使用 Java添加KeyMob手机聚合平台教程
  10. python字典的键有什么要求_在Python中使用范围作为字典键,我有什么选择?
  11. Java 中foreach 的用法
  12. wxPython色环电阻计算器
  13. PDF能编辑吗,PDF文件怎么拆分页面
  14. AWS Python应用
  15. 基于JSP实现医院病历管理系统,程序员如何在工作中自我增值
  16. 选取单元格区域和选中整个单元格的技巧:
  17. mysql 红黑树_微信大牛教你深入了解数据库索引
  18. Debug-PC之开山老祖[转]
  19. 域控中将计算机账户移动到特定OU下
  20. Visual Studio SVN创建分支 合并分支 切换分支 vs 插件 visualsvn

热门文章

  1. ParNew垃圾收集器
  2. CentOS7.5 Linux搭建全文检索--Solr7.4.0单机服务
  3. [leetcode]242. Valid Anagram判断两个字符串是不是包含相同字符的重排列
  4. 如鹏网学习笔记(十二)HTML5
  5. 关于 QImage::Format_Mono
  6. jgGrid常用操作--持续更新
  7. 王伟storm_王伟 - 南京大学 - 化学化工学院
  8. 单结晶体管的导电特性_适用于印刷电子的导电墨水可在纸和PET薄膜上印刷薄膜晶体管...
  9. jsp mysql更新表数据库_一个关于JSP更新数据库MySQL中的表的问题!
  10. python中字典类型中的item是什么-Python中的字典介绍