动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。

针对二进制文件有用的命令

查看文件类型

file

查看二进制文件链接到哪些库

ldd

查看二进制文件里面所包含的symbol,T表示加载,U表示undefined symbol

nm

读二进制文件里面的信息

readelf -a smu.o

将二进制文件转换为汇编

objdump -d sum.o

动态链接库的生成

sum.c

#include

#include

int sum(int x){

int i, result=0;

for(i=0; i<=x; i++){

result+=i;

}

if(x > 100)

exit(-1);

return result;

};

void display(char* msg){

printf("%s\n",msg);

}

int add(float a,float b){

return a+b;

}

int sum_array(int array[], int num){

int i =0, sum = 0;

for(i=0; i

sum += array[i];

return sum;

}

void modify_array(int array[], int num){

int i =0, sum = 0;

for(i=0; i

array[i] *= 10;

}

main.c

#include

#include

int main(void){

int x;

printf("Input an integer:\n");

scanf("%d", &x);

printf("sum=%d\n", sum(x));

return 0;

};

生成可执行文件

gcc -c main.c -o main.o

gcc -c sum.c -o sum.o

gcc sum.o main.o

将会生成main的可执行文件

file main // ELF 64-bit LSB executable

file sum.o // ELF 64-bit LSB relocatable

因为sum.c里面含有可复用的函数,所以想把sum.c编译成为一个动态链接库

gcc sum.o -shared -o sum.so

出现错误,提示

/usr/bin/ld: sum.o: relocation R_X86_64_PC32 against undefined symbol `exit@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: final link failed: Bad value

collect2: error: ld returned 1 exit status

这说明不是所有的.o文件都能编译成为动态链接库,需要在.o文件生成时加参数-fPIC

gcc -c sum.c -fPIC -o sum.o

gcc sum.o -o shared sum.so

一般,共享库的编译命令为(曾经的实验)

动态链接库

gcc -shared -fPIC -o libmyhello.so hello.o

gcc -o hello main.c -L. -lmyhello

静态链接厍

ar rcs libxx.a xx.o

g++ -o main main.cpp -static -L. -lxx

这时候再

g++ -o main main.c sum.so

./main

有时会报错

error while loading shared libraries: sum.so: cannot open shared object file: No such file or directory

ldd main

output:

sum.so => not found

这时候需要

export $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

注意:-fPIC是生成.o时使用,-shared是用来生成动态链接库的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Linux命令行调用动态库,Linux动态链接库的使用相关推荐

  1. linux用c++调用动态库

    1.3 用c++静态方式调用动态库libsthc.so: /*cpptest.cc*/    //linux下的c++后缀有cc,cxx, cpp #include "libsthc.h&q ...

  2. linux命令之查看动态库符号-nm

    在调用动态库的时候,经常出现由于动态库接口修改或者版本不匹配导致调用动态库找不到函数接口符号的情况. 原因可能有如下几种: 1.由于c++动态库编译没有加extern c导致函数编译时加了c++的前缀 ...

  3. java 执行linux命令行_10个高效Linux技巧及Vim命令对比

    专注于Java领域优质技术,欢迎关注 作者:vimtutor 来自:Vim教程网 Vim的很多命令和功能与Linux系统的命令和功能及其相似,可以说是一脉相承.Vim教程网(https://vimjc ...

  4. linux命令行下载github文件,Linux命令行下使用GitHub

    Linux命令行下使用GitHub 1.注册github账号 2.创建ssh密钥 cd ~ ssh-keygen -t rsa -C your_email@example.com 1 2 cd~ ss ...

  5. linux命令行大全 笔记,《Linux命令行大全》读书笔记

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? shell就是一个程序,它接受从键盘输入的命令,然后把命令传递给操作系统执行.当使用图像用户界面时,我们需要一个叫做终端 ...

  6. linux命令行 随机排列,有趣的Linux命令行:随机输出唐诗宋词

    有趣的Linux命令行:随机输出唐诗宋词 fortune命令,随机输出一句话,或者是一句英文名言,或者是一首唐诗宋词来,如果没有唐诗宋词,那就需要用fortune-zh bkjia@bkjia:~$ ...

  7. linux命令行颜色,技术|在 Linux 命令行中自定义文本颜色

    在 Linux 命令行当中使用不同颜色以期提供一种根据文件类型来识别文件的简单方式.你可以修改这些颜色,但是在做之前应该对你做的事情有充分的理由. 如果你在 Linux 命令行上花费了大量的时间(如果 ...

  8. linux命令行 jdb,设置调试linux下jdb远程调试tomcat源码

    时间紧张,先记一笔,后续优化与完善. 在tomcat打开调试设置jvm参数 -Xrunjdwp:transport=dt_socket,server=y,address=9090,suspend=y ...

  9. linux命令之查看动态库中字符串-strings

    strings命令是在对象文件或者二进制文件中查找可打印的字符串,有很多的用途,例如一个用法就是在编译的so中定义字符串常量作为动态库的版本号,然后就可以使用strings+grep 组合命令查看当前 ...

最新文章

  1. NeHe OpenGL第三十九课:物理模拟
  2. 借助Scrum工作室使用敏捷原则提升组织响应能力
  3. spring与springBoot不同之处
  4. 美团点评业务风控系统构建经验
  5. CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现
  6. java 内存排序_详细解析Java内存,处理器重排序,编译器重排序以及它对线程的影响...
  7. ITK:笛卡尔方位角高程
  8. Jupyter 绘图怎么显示中文
  9. mysql的数据库操作类_MYSQL数据库操作类
  10. Spring Cloud 学习笔记(三) 之服务治理模块Spring Cloud 服务发现与消费
  11. log4j 打印线程号配置_Log4J日志整合及配置详解
  12. React传递参数的多种方式
  13. Reflect Refract (以水渲染为例)
  14. ValueError: expected sequence of length 791 at dim 1 (got 185)
  15. ubuntu18.04 安装数据库
  16. 电脑如何恢复声音_电脑不小心丢失照片如何恢复如初
  17. sd卡计算机无法读取数据,怎么强制格式化sd卡-内存卡突然无法读取、数据损坏……整个人都是崩溃的!...
  18. 10-新闻发布系统数据库-新闻管理数据操作
  19. 差距几何 Vista与XP系统性能对比测试(下)
  20. 小程序接入h5页面_微信小程序跳转外部链接(h5页面)以及数据交互

热门文章

  1. 日历视图的XML属性
  2. 基于django和vue的xdh官网设计
  3. mysql时间间隔interval_MySQL DATEDIFF函数获取两个日期的时间间隔的方法
  4. python 垃圾回收机制
  5. java添加按钮点击事件_如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?...
  6. u3d游戏开发视频潭州_游戏美术行业的发展与应用人工智能学院专业介绍及未来前景系列报告会二...
  7. buidulbs android.jar,在将AS项目迁移到IDEA时,无法将com.android.bui...
  8. LeetCode371——Sum of Two Integers(不用+)
  9. 二进制、十进制、其他进制之间的转换
  10. 【练习---日志文件的恢复】-----多元化成员中,单个成员丢失