Chinaunix首页 | 论坛 | 博客
  • 博客访问: 994410
  • 博文数量: 632
  • 博客积分: 2778
  • 博客等级: 大尉
  • 技术积分: 3387
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 09:09
个人简介

123

文章分类

全部博文(632)

文章存档

2014年(36)

2013年(33)

2012年(563)

分类:

2012-12-12 11:38:54

动态库:
chechunli@chechunli-desktop:test_makefile $ tree
.
|-- Makefile
|-- fun.c
|-- lib
|   `-- fun.h
|-- main
`-- main.c

1 directory, 5 files

chechunli@chechunli-desktop:test_makefile $ cat main.c 
#include
#include "fun.h"

int main()
{
    fun(3, 4);
}

chechunli@chechunli-desktop:test_makefile $ cat fun.c 
#include
#include "fun.h"

int fun(int a, int b)
{
    printf("%d + %d = %d\n", a, b, a+b);
    return a + b;
}

chechunli@chechunli-desktop:test_makefile $ cat lib/fun.h 
#ifndef _FUN_H_
#define _FUN_H_
int fun(int , int);
#endif

chechunli@chechunli-desktop:test_makefile $ cat Makefile 
all: main 

main: main.o lib
gcc -o main -L. -lfun main.o
#-L: link .so path -l libxxx.so xxx name
#this example is libfun.so  fun.

main.o:
gcc -c main.c -I lib

fun.o:
gcc -c fun.c -I lib

lib: fun.o
gcc -fpic -shared -o libfun.so fun.o

clean:
rm -rf *.o
rm -rf *.so

chechunli@chechunli-desktop:test_makefile $ make
gcc -c main.c -I lib
gcc -c fun.c -I lib
gcc -fpic -shared -o libfun.so fun.o
gcc -o main -L. -lfun main.o

chechunli@chechunli-desktop:test_makefile $ ls
fun.c  fun.o  lib  libfun.so  main  main.c  main.o  Makefile
chechunli@chechunli-desktop:test_makefile $ ./main 
./main: error while loading shared libraries: libfun.so: cannot open shared object file: No such file or directory

chechunli@chechunli-desktop:test_makefile $ export LD_LIBRARY_PATH=.
chechunli@chechunli-desktop:test_makefile $ ./main 
3 + 4 = 7

chechunli@chechunli-desktop:test_makefile $ env
...
OLDPWD=/home/chechunli/Mine
USER=chechunli
LD_LIBRARY_PATH=.
...

chechunli@chechunli-desktop:test_makefile $ unset LD_LIBRARY_PATH
...
OLDPWD=/home/chechunli/Mine
USER=chechunli
...

-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的
任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不
是固定的。
-shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描
述信息,去除共享库所不需的信息。

静态库:
chechunli@chechunli-desktop:test_makefile $ tree
.
|-- Makefile
|-- fun.c
|-- lib
|   `-- fun.h
|-- libfun.a
`-- main.c

1 directory, 5 files
chechunli@chechunli-desktop:test_makefile $ cat fun.c 
#include
#include "fun.h"

int fun(int a, int b)
{
    printf("%d + %d = %d\n", a, b, a+b);
    return a + b;
}

chechunli@chechunli-desktop:test_makefile $ cat lib/fun.h 
#ifndef _FUN_H_
#define _FUN_H_
int fun(int , int);
#endif
chechunli@chechunli-desktop:test_makefile $ cat main.c 
#include
#include "fun.h"
int main(int argc, char *argv[])
{
    fun(1, 2);
    return 0;
}
chechunli@chechunli-desktop:test_makefile $ cat Makefile 
all: main

main: main.o libfun.a
gcc -o main main.o libfun.a

main.o:
gcc -c main.c -I lib

fun.o:
gcc -c fun.c -I lib

libfun.a: fun.o
ar -rcs libfun.a fun.o


clean:
rm -rf *.o
静态库只相当于是打包而已。
阅读(396) | 评论(0) | 转发(0) |
0

上一篇:Shell 编程基础

下一篇:Makefile图解

给主人留下些什么吧!~~