Linux命令行调用动态库,Linux动态链接库的使用

动态链接库与普通的程序相比而言,没有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是用来生成动态链接库的

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux用户、用户组、文件权限设置

最近打算更仔细学习一下linux操作系统。先是恶补了一下用户、用户组、文件权限这三样比较重要的知识。(我也正在学Linux&#xff0c;所以就找到这篇日志了&#xff0c;有些设置修改后需要重启系统后才能生效。)学习这几样东西&#xff0c;得先掌握linux的权限系统相关知识。lin…

linux系统ip访问53端口,linux – 使用公共IP地址无法访问本地端口

我有一个linux服务器,它有公共IP和私有IP.因此,当我使用公共IP登录时,终端直接显示私有IP.例&#xff1a;$ssh root55.27.XX.XXroots password:root10.1.4.20:~$hostname -I10.1.4.20root10.1.4.20:~$wget -qO- http://ipecho.net/plain ; echo55.27.xx.xx现在,我安装了Nginx,我…

微信扫码下载iosAPP

1.首先在应用宝上传你的安卓APP应用&#xff0c;AppStore已经有了APP 2.进入应用宝app应用管理中心&#xff0c;点击“微下载”&#xff0c;然后里面的微下载链接地址就可以用了&#xff0c;可以看到ios可以通过应用宝再跳到AppStore就可以实现下载了转载于:https://www.cnblog…

linux当前时间到1970年秒数,计算从1970年到当前时间所经历过的秒数

这个算法来自LINUX的源码&#xff0c;下面带有大神的解析&#xff0c;自己在RTC实验中也使用了&#xff0c;不用月份表&#xff0c;润平年的处理&#xff0c;几行就可得出结果&#xff0c;以下是程序和大神的解析Linux源码中的mktime算法解析我们知道&#xff0c;从CMOS中读出来…

脱水缩合(大搜索)

脱水缩合 (merge.c/cpp/pas) 【题目描述】 fqk 退役后开始补习文化课啦&#xff0c; 于是他打开了生物必修一开始复习蛋白质&#xff0c;他回想起了氨基酸通过脱水缩合生成肽键&#xff0c;具体来说&#xff0c;一个氨基和一个羧基会脱去一个水变成一个肽键。于是他脑洞大开&am…

ubuntu16.04下安装NS-2.35以及对simple例的理解

本人是在VMWare上安装的ubuntu16.04版本&#xff0c;然后安装NS2.35. 1.下载ns2的安装包&#xff0c;这里我选择的是ns-allinone-2.35.tar.gz压缩格式的all in one安装包&#xff0c;all in one 安装包包含所有的组件&#xff0c;比较方便&#xff0c;另附下载地址&#xff1a;…

linux查看登录服务器的ip历史记录,通过登陆IP记录Linux所有用户登录所操作日志的方法...

对于Linux用户操作记录一般通过命令history来查看历史记录&#xff0c;但是如果在由于误操作而删除了重要的数据的情况下&#xff0c;history命令就不会有什么作用了。那么依然要存有历史操作记录应该如何来实现呢&#xff1f;其实我们可以通过登陆IP地址来记录所有用户登录所操…

linux 向程序发送信号,Linux下的信号处理

Linux下的信号处理发布时间:2006-01-02 09:34:14来源:红联作者:reing前言&#xff1a;这一章我们讨论一下Linux下的信号处理函数。Linux下的信号处理函数&#xff1a;信号的产生信号的处理其它信号函数一个实例1.信号的产生Linux下的信号可以类比于DOS下的INT或者是Windows下的…

思科模拟器:[1]安装及汉化详解

思科模拟器是网络工程师经常使用的网络实验模拟软件&#xff0c;它可以很快捷的模拟网络中的各种设备(交换机、路由器、台式电脑、笔记本电脑、服务器、网络云)&#xff0c;搭建各种网络环境&#xff0c;模拟网络拓扑结构等。下面天使图文教程&#xff0c;告诉大家怎么安装这个…

linux中的加法函数,上下文管理练习(为加法函数计时)

上下文管理(为加法函数计时)为加法函数计时使用装饰器显示该函数的执行时长使用上下文管理显示该函数的执行时长装饰器实现import timeimport datetimefrom functools import wrapsdef logger(fn):wraps(fn) # wraps(fn)(wrapper)def wrapper(*args, **kw):start datetime.dat…

07数组与接口

1、运行TextInherists.java 示例&#xff0c;观察输出&#xff0c;注意总结父类与子类之间构造方法的的调用关系&#xff0c;修改parent构造方法的代码&#xff0c;显式调用grandparent另一个构造函数。 源代码&#xff1a; class GrandParent{ public GrandParent(){ System.o…

windows 访问linux中的mongodb,MongoDB的linux系统下的安装与连接

一 安装MongoDB的服务下载Linux系统下的MongoDB安装包上传压缩包到linux服务器中&#xff0c;解压到对应的安装目录下mkdir /usr/local/mongodbtar -zxvf mongodb-linux-x86_64-4.0.10.tgzmv mongodb-linux-x86_64-4.0.10 /usr/local/mongodb新建目录&#xff0c;分别用来存储数…

像阿超那样,花20分钟写一个能自动生成小心四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算。 和同学们比较一下各自程序的功能,实现方法的异同,等等...

package chapter;public class szys { public static void main(String[] args) { print30Questions(); } private static void print30Questions() { //说明&#xff1a;打印30道题函数&#xff0c;把接收到的题目字符串按照指定格式输出。…

linux sqlserver 管理工具,Linux连接SqlServer的图形化工具SQuirrel

SQuirrel SQL一款基于java的数据库管理工具。所以可以运行在任意平台上&#xff0c;除了界面丑一点。在windows上我绝对不会选的&#xff0c;navicat多好。安装下载地址&#xff1a;https://sourceforge.net/projects/squirrel-sql/?sourcetyp_redirect在控制台运行&#xff1…

【转】C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.

// 复制数据至剪切板BOOL CopyToClipboard(const char* pszData, const int nDataLen){ if(::OpenClipboard(NULL)) { ::EmptyClipboard(); HGLOBAL clipbuffer; char *buffer; clipbuffer ::GlobalAlloc(GMEM_DDESHARE, nDataLen1); …

linux中sort命令实例,Linux命令之排序命令sort使用实例

名称&#xff1a;sort位置&#xff1a;/usr/bin/sort权限&#xff1a;所有用户用法&#xff1a; sort [OPTION]... [FILE]...sort [OPTION]... --files0-fromF选项&#xff1a;-b --ignore-leading-blanks 忽略最前面的空格-f --ignore-case fold lower case to…

JDK源码包结构分类

最近查看JDK源码时&#xff0c;无意间发现几个类在陌生包里&#xff1a;com.sun.*、sun.*、org.*&#xff0c;google了一把总结了下以备他人搜索&#xff0c;如内容有误欢迎指正&#xff01;Jre库包含的jar文件(jdk1.6)&#xff1a;resources.jar、rt.jar、jsse.jar、jce.jar、…

linux帮助命令和用法,Linux命令帮助及history命令的使用

1.Linux命令帮助的获取详解在Linux中获取命令帮助时&#xff0c;内部命令和外部命令的获取方式是有区别的&#xff1a;即(1)内部命令&#xff1a;#help COMMAND? #man bash(2)外部命令&#xff1a;<1> # COMMAND --help# COMMAND -h<2> 使用手册(manu…

GJM :Sql 各种语句 以及函数 [转载]

版权声明&#xff1a;本文原创发表于 【请点击连接前往】 &#xff0c;未经作者同意必须保留此段声明&#xff01;如有侵权请联系我删帖处理&#xff01;1.更改数据库的名称 2.表中有数据的情况下再添加列、删除列 3.在SQLServer 中各种查询语句的使用示例 4.模糊查询的语句 5.…

linux中断处理体系结构分析(一),Linux中断处理体系结构分析(二)

1.中断处理的体系结构我们知道编写设备驱动程序一定要用到中断处理函数&#xff0c;这在驱动程序的编写中&#xff0c;占据很重要的一部分。在响应一个特定的中断的时候&#xff0c;内核会执行一个函数&#xff0c;该函数叫做中断处理程序(interrupt handler)或中断服务例程(in…