linux 编译、链接、静态链接、动态链接

3个文件,main.c      binaryprint.h      binaryprint.c    

函数的功能:打印一个整数的二进制形式。

binaryprint.h

void binaryprint(int a);

binaryprint.c  


 
 
#include <stdio.h>
#include "binaryprint.h"
void binaryprint(int a)
{
    int count = 32;
    while (count--)
    {
	if (1 << count & a)
	    printf("1");
	else
	    printf("0");
	if (count % 8 == 0)
	    printf(" ");
    }
    printf("\n");
}

main.c

#include <stdio.h>
#include "binaryprint.h"
int main()
{
    binaryprint(1);
    binaryprint(8);
    binaryprint(1024);
    return 0;
}

编译:gcc    -c    main.c    binaryprint.c

ls之后发现多了两个文件    main.o    binaryprint.o

链接:gcc    -o    main    main.o    binaryprint.o

执行:./main


静态链接:

ar    rc    libbinaryprint.a    binaryprint.o

libbinaryprint.a是生成的静态库文件,lib 是前缀,.a是后缀,实际上就是将.o文件打包在一起

gcc    -o    main2    main.o    -L./    libbinaryprint.a    或者    gcc    -o    main2    main.o    -L./    -lbinaryprint

-L./    表示静态库文件在当前文件夹    -l选项可以省略前缀、后缀

然后./main2就可以啦

动态链接:

gcc  -fPIC  -shared  binaryprint.c  -o  libbinaryprint.so  
编译选项 .c文件 动态库
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。


将动态库文件添加到库搜索路径中,

方法1:

一般在/lib  或者/user/lib

sudo cp  /home/xx/libbinaryprint.so    /lib

gcc    -o    main2    main.o    -L./   libbinaryprint.so

然后./main2就可以了

方法2;

修改    LD_LIBRARY_PATH环境变量,将库文件的路径添加进来

export    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xx

gcc    -o    main3    mian.o    -L./    libbinaryprint.so

然后./main3就可以了








猜你喜欢

转载自blog.csdn.net/znzxc/article/details/80241704
今日推荐