欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-03 08:39:04
...

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

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

静态链接:

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就可以了