静态链接库与动态链接库LINUX_C


写main.c mytool1.c mytool1.h mytool2.c mytool2.h,使main.c包含mytool1 mytool2

/*
 * main.c
 */

#include "mytool1.h"
#include "mytool2.h"

int main (int argc, char *argv[])
{
        mytool1_print ("hello");
        mytool2_print ("hello");

        return 0;
}

/*
 * mytool1.h
 */

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
/*注意此处函数声明为void,如果不包含stdio.h,gcc编译出错*/
#include

void mytool1_print (char *print_str);

#endif

/*
 * mytool1.c
 */

#include "mytool1.h"

void mytool1_print (char *print_str)
{
        printf ("This is mytool1 print %s\n", print_str);
}

/*
 * mytool2.h
 */

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H

#include

void mytool2_print (char *print_str);

#endif

/*
 * mytool2.c
 */

#include "mytool2.h"

void mytool2_print (char *print_str)
{
        printf ("This is mytool2 print %s\n", print_str);
}


======================
使用GCC编译
gcc -c mytool1.c   默认生成后缀为.o的同名文件,如果指定为非同名文件,gcc -c mytool1.c -o a.out不影响main的使用
gcc -c mytool2.c
gcc -c main.c
gcc -o main main.o mytool1.o mytool1.o   需要指定每一个需要用到的文件
======================
使用make

#Makefile

main: main.o mytool1.o mytool2.o
        gcc -o $@ $^
..c.o:
        gcc -c $<


需要在Makefile中指定生成main用到的文件 及它们的依赖关系,执行make即可

=====================
使用静态链接库
ar crv libmytool1.a mytool1.o
ar crv libmytool2.a mytool2.o
使用静态链接库
gcc -o main main.o -L . -lmytool1 -lmytool2
-L指定库所在的目录 -l后紧跟库的名称,也可以写为
gcc -o main main.o -L. -lmytool1 -lmytool2
-L.表示静态库在当前目录

使用静态链接库,生成可执行程序main时,将静态库链接进程序,以后运行时不需要再链接
=====================
使用动态链接库
从.c文件创建动态库
gcc -shared -fPIC -o libmytool1.so mytool1.c
gcc -shared -fPIC -o libmytool2.so mytool2.c
使用动态链接库
gcc -o main main.o -L. -lmytool1 -lmytool2
成功生成可执行文件main

但是在运行时出错,可以看出动态链接库在运行时是需要的,而且不在当前目录下面找
./main: error while loading shared libraries: libmytool1.so: cannot open shared object file: No such file or directory

将libmytool1.so libmytool2.so拷贝到/usr/lib64目录下(我装的是64位系统,放在/usr/lib下依然找不到),再运行main,则执行成功,另外设置LD_LIBRARY_PATH指向库所在的目录也可以,而且不需要root权限
======================
-shared 指定生成动态链接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件。
-fPIC 表示编译为位置独立的代码,不用此选项则编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。


LD_LIBRARY_PATH可指定动态链接库的位置,也可以(需要root权限)修改/etc/ld.so.conf,然后使用/sbin/ldconfig来达到同样的目的

=====================

使用动态库与静态库的命令一样,如果动态链接库与静态链接库在同一个目录下,优先使用动态链接库


参考:

http://blog.csdn.net/anxiongshan/article/details/1813620

C专家编程

其它网上资料,已经记不清了。

你可能感兴趣的:(C,LINUX)