杀出条血路来

坚持就是胜利

Linux静态和动态链接库使用实例

Linux静态和动态链接库使用实例

Ø         不同于Win32DLLLinux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。也就是说不用头文件即可被导出。

Ø         静态和动态的区别

静态库的代码在编译时已经进入被包含到目标文件了;而动态库的代码要在目标文件运行的时候才会被包含进去,在编译的时候只是对动态库进行一个链接。

 

1、静态链接库实例

//fun1.h

#include <stdio.h>

void fun1printf();

////////////////////////////////////////////////////////////////////////////////////////////

//fun1.c

#include "fun1.h"

void fun1printf()

{

printf("fun1printf!/n");

}

////////////////////////////////////////////////////////////////////////////////////////////////

//fun2.h

#include <stdio.h>

void fun2printf();

////////////////////////////////////////////////////////////////////////////////////////////////

//fun2.c

#include "fun2.h"

void fun2printf()

{

 printf("fun2printf!/n");

}

/////////////////////////////////////////////////////////////////////////////////////////////////////

//staticcall.c

#include <stdio.h>

int main()

{

fun1printf();//不需要导入,直接引用函数

}

///////////////////////////////////////////////////////////////////////////////////////////////////////

//makefile

all:staticlib main

staticlib:fun1.c fun2.c

       gcc -c -o fun1.o fun1.c

       gcc -c -o fun2.o fun2.c

       ar cqs libfun.a fun1.o fun2.o

main:staticcall.c libfun.a

       gcc -o staticcall staticcall.c -L ./  -lfun

生成静态链接库的命令是ar cqs

 

2、动态链接库实例

所有文件同静态链接库,只是makefile编写不一样。

all:sharedlib sharedcall

sharedlib:fun1.c fun2.c

       gcc -fPIC -c fun1.c -o fun1.o

       gcc -fPIC -c fun2.c -o fun2.o

       gcc -shared fun1.o fun2.o -o libfun.so

sharedcall:

       gcc -o sharedcall -L ./ -lfun sharedcall.c

编译生成动态链接库的文件时,必须加上-fPICPosition Independent Code(地址无关编码)。

 

在运行程序之前,必须:

Ø         export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/ccode/dll/

Ø         /etc/ld.so.conf中添加/root/ccode/dll/路径

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭