linux C 动态共享库编译链接

 

1.1.1         linux编写so文件的方式

1首先gcc编译的时候要加-fPIC选项,-fPIC是告诉gcc生成一个与位置无关的代码

2gcc链接的时候要加-shared选项,意思是生成一个so共享库。

对于linux或者unix,一个so文件,文件扩展名必须是so,文件名的前三个字母必须是lib

1.1.2         linux使用so

gcc链接的时候需要加-L.代表从当前目录下找相关的so文件,-l文件名(但不包括文件名开头的lib和扩展名so)

例如编译一个main.o文件,要用到当前目录下的liba.so库

gcc –o main.out –L. –la main.o

1.1.3         配置profile文件可以在当前目录下查找so文件

linux不在当前目录下寻找可执行程序,同时也不早当前目录下找so库文件

修改用户配置文件的方法

1

cd

2

vi .bash_profile

3

export LD_LIBRARY_PATH =$LD_LIBRARY_PATH:.

4

保存退出

5

. .bash_profile

[email protected]:~/link/c$ cat mymax.c 
int max(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}

[email protected]:~/link/c$ cat mymax.h 
#ifndef MYMAX_C_
#define MYMAX_C_
int max(int a,int b);

#endif 

[email protected]:~/link/c$ cat main.c 
#include <stdio.h>
#include "mymax.h"
int main()
{
	printf("max =%d \n",max(1,4));
	return 0;
}
[email protected]:~/link/c$ 

[email protected]:~/link/c$ gcc -c -o mymax.o  -fPIC  mymax.c  告诉编译器产生与位置无关代码
[email protected]:~/link/c$ gcc -shared -o libmymax.so mymax.o  mymax.o 生成so共享库,必须以lib开头,扩展名必须是.so
[email protected]:~/link/c$ gcc -c main.c -o main.o
[email protected]:~/link/c$ gcc -o main.out main.o -L. -lmymax
[email protected]:~/link/c$ ./main.out 
max =4

echo ‘export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.‘ >> /home/chunli/.bashrc

[email protected]:~/link/c$ . /home/chunli/.bashrc

复制到其他目录:

照样运行:

[email protected]:~/link/c$ cp libmymax.so main.out /tmp/
[email protected]:/tmp$ ./main.out 
max =4
时间: 2024-10-01 17:29:16

linux C 动态共享库编译链接的相关文章

/etc/ld.so.conf和/etc/ld.so.cache –linux动态共享库

可执行程序找不到要链接的动态共享库,这是Linux上面编译和运行程序很容易碰到的问题,接下来我们要探讨一下怎么设置程序寻找动态共享库的行为.Linux操作系统上面的动态共享库大致分为三类:1.操作系统级别的共享库和基础的系统工具库比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录.如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如

Linux动态共享库

Linux操作系统上面的动态共享库大致分为三类:   一.操作系统级别的共享库和基础的系统工具库 libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录.如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6 /lib64目录.此外还可能有其他特定Linux版本的系统库目录. 这些系统库文件的完整和版

72)MFC测试动态共享库

动态共享库: 首先我建立一个新的动态库: 然后不选择空项目了,因为我们普通的cpp文件 入口是main  win32入口是winmain  那么这个动态库的入口在哪里  我们就是为了看一看: 出来这样的结果: 然后我们看看他是怎么进入这个函数的,就是这个case,下面我们新建一个MFC项目: 发现一个点: 然后 我们修改那个动态库中的代码: 趁着我的动态库是加黑的  所以直接生成就行了. 因为  我们将动态库和MFC项目放到衣蛾解决方案下的  所以  就不用导入 动态库的.h文件  dll文件和

【Linux笔记】细说linux系统下共享库的命名规范和使用方法

1. Shared Library的优势 共享库,又称动态库或so文件,顾名思义,它可以在可执行文件启动时加载或进程运行期被调用.使用共享库有很多好处,例如(包含但不限于下面提到的场景): 1) 减少了依赖共享库的模块的大小,因为它们不必把共享库提供的功能的实现代码静态编译到自己的模块代码中. 2) 在同一台机器上运行的多个进程会在内存中共享同一份动态库,操作系统采用的这种内存布局方式可以极大地节省机器内存资源. 3) 若很多模块依赖了以共享库形式提供的同一个底层库,则底层库升级时,只需升级该s

linux指定动态运行库的位置

动态运行库在windows.linux下均广泛使用.windows下通常为dll文件,linux下为so文件.不过,对于部署程序,这两个系统查找依赖的运行库文件时却不一样.对于windows而言,优先查找当前目录下,然后再到系统库文件C:\windows\system32(记不太清楚,好像是这个位置)下查找.这个特性极大的方便了程序的部署,程序员只需要把相关的dll打包就OK,这也让很多程序可以制作成绿色版.而在linux下,默认只到/lib./usr/lib和/usr/local/lib查找,

链接(extern、static关键词\头文件\静态库\共享库)

原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = -1; void push(char c) {         stack[++top] = c; } char pop(void) {         return stack[top--]; } int is_empty(void) {         return top == -1; }

Linux共享库.so文件的命名和动态链接

Linux中的.so文件 是动态链接的产物 共享库理解为提供各种功能函数的集合,对外提供标准的接口 Linux中命名系统中共享库的规则 主版本号:不同的版本号之间不兼容 次版本号:增量升级 向后兼容 发行版本号:对应次版本的错误修正和性能提升,不影响兼容性 Linux中的共享库并不都是这样的格式 比如GLibc的共享库命名为:libc-x.y.z.so 动态链接器也是GLibc的一部分,使用ld-x.y.z.so命名 libm(数学库)等 SO-NAME机制 系统和程序中要链接的共享库的格式一般

C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

目录 0. 引言 1. 交叉编译 2. Cygwin简介 3. 静态库编译及使用 4. 动态库编译及使用 5. MinGW简介 6. CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统.linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统.为什么linux和unix之间有很多软件可以很轻松的移植?因为linux也满足POSIX规范,所以在运行机制上跟unix相近.同时,POSI

Linux学习笔记7——linux中的静态库和动态库

一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用ar -r可以将文件归档成静态库,调用格式:ar -r 静态库文件 被归档的文件 例如:我们这有两个C文件,分别为test1.c和test2.c 首先我们将它编译成目标文件:gcc -c -static test1.c gcc -c -static test2.c 此时会产生两个文件,分别为test1