ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux下编译动态库

2020-02-21 20:05:53  阅读:233  来源: 互联网

标签:ld int 编译 num so linux print 动态


#include <stdio.h>   //num.c

int add_num(int a, int b){
	return a+b;
}

int sub_num(int a, int b){
	return a-b;
}
#include <stdio.h>   //print.c

int print_num(int n){
	printf("result is %d\n", n);
	return 0;
}
#include <stdio.h>   //hw.c
#include <my_lib.h>
int main(){
	int ret=0;
	int a=8,b=5;
	ret=add_num(a,b);
	print_num(ret);
	ret=sub_num(a,b);
	print_num(ret);
	return 0;
}
#ifndef __MY_LIB_H__
#define __MY_LIB_H__

int add_num(int a, int b);
int sub_num(int a, int b);

int print_num(int n);
#endif

 

以上便是四个文件与编译过程。接下来说说编译遇到的情况

第一步,编译出动态库 gcc -o libnum.so -fPIC -shared num.c print.c 

1. -shared,众所周知啊,.so时share object的缩写。为了让gcc知道是在编译 .so而不是可执行文件,所以需要-shared

2. -fPIC,这是编译动态库必须的。可见黄色圈起来的地方,分开编译,没加-fPIC,就会报错,提醒重新编译。其实-fPIC是编译选项,PIC是 Position Independent Code 的缩写,表示要生成位置无关的代码,这是动态库需要的特性。

第二步,链接动态库,编译可执行文件 gcc -o test hw.c -I. -L. -lnum,没什么好说的

第三步,运行生成的可执行文件。

发现系统报错了。找不到libnum.so,原来Linux是通过/etc/ld.so.cache 文件搜寻要链接的动态库的。而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。
(注意,  /etc/ld.so.conf  中并不必包含 /lib 和 /usr/libldconfig程序会自动搜索这两个目录)

如果我们把 libnum.so 所在的路径添加到 /etc/ld.so.conf 中,再以root权限运行 ldconfig 程序,更新 /etc/ld.so.cache ,a.out运行时,就可以找到 libmum.so

但为此去改动系统的东西,不大行。

所以,我就搜了下还有啥办法,其实把 libnum.so添加到LD_LIBRARY_PATH就ok了,换句话说,就是把当前路径添加一下。

最简单办法自然就是export  LD_LIBRARY_PATH=LD_LIBRARY_PATH:$pwd。

不过这样重新打开时候还要再搞一遍,还不如写道 ~/.profile或者 ~/.bashrc好。source ~/.profile 就ok了

tjw316248269 发布了10 篇原创文章 · 获赞 0 · 访问量 156 私信 关注

标签:ld,int,编译,num,so,linux,print,动态
来源: https://blog.csdn.net/tjw316248269/article/details/104433343

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有