今天,一个同事编译静态库,我也趁此机会在温习一下,先google一下,然后在自己实验。

 

首先,在网上抄个例子,内容如下:



 1:建静态库

/*  hellos.h  */

#ifndef _HELLO_S_H

#define _HELLO_S_H


void printS(char* str);


#endif


/*  hellos.c  */

#include "hellos.h"


void printS(char* str) {

  printf("print in static way: %s", str);

}


输入命令:

gcc -c -o hellos.o hellos.c

ar cqs libhellos.a hellos.o 

于是得到了 libhellos.a这么一个静态链接库


2:主程序

/*  main.c  */

#include <stdio.h>

#include "hellos.h"


main() {

  char* text = "Hello World!\n";

  printS(text);

}

编译链接:

gcc -o hello main.c -static -L. -lhellos 

然后运行hello可以看到输出

print in static way: Hello World!

删除 libhellos.a和 hellos.*后, 程序仍然正常运行。 


下面再来看 动态链接 

3:建动态库

/*  hellod.h  */

#ifndef _HELLO_D_H

#define _HELLO_D_H


void printD(char* str);


#endif


/*  hellod.c  */

#include "hellod.h"


void printD(char* str) {

  printf("print in dynamic way: %s", str);

}


输入命令:

gcc -shared -o libhellod.so hellod.c 

于是得到了 libhellod.so 这么一个动态链接库 


4: 主程序

/*  main.c  */

#include <stdio.h>

#include "hellod.h"


main() {

  char* text = "Hello World!\n";

  printD(text);

}

编译链接:

gcc -o hello main.c -L. -lhellod 


原文中存在一定错误,我已经修订,并且最会运行的话,需要设置动态库执行路径

否则出现下述错误:

  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

当设定了LD_LIBRARY_PATH或者放在/usr/lib和/lib后,又出现下面的错误:

   ./hello: error while loading shared libraries: /usr/lib/libhello.so: cannot restore segment prot after reloc: Permission denied

这是SELinux引起的,修改如下:

chcon -t texrel_shlib_t /usr/lib/libhello.so

之后,运行,OK。

下面说一下混合编程:

 



/*  main.c  */

#include <stdio.h>

#include "hellos.h"

#include "hellod.h"


main() {

  char* text = "Hello World!\n";

  printS(text);

  printD(text);

}


上面的文章又说错了,自己google一下,某人如下说:

 

在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。使用方式为:

gcc test.cpp -L. -ltestlib

如果当前目录有两个库libtestlib.so libtestlib.a 则肯定是连接libtestlib.so。如果要指定为连接静态库则使用:

gcc test.cpp -L. -static -ltestlib

使用静态库进行连接。

当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式:

gcc test.cpp -L. -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic -ltestlib