linux · 2020-05-19 0

gcc的编译及动态静态库的使用

一、gcc的编译

  • 预处理(pre-processing) E:插入头文件,替换宏,将stdio.h文件中的内容插入到hello.c中
  • 编译(compliling) S:编译成汇编代码
  • 汇编(Assembling) c:编译成目标文件
  • 链接(Linking):链接到库中,变成可执行文件

1.gcc常用选项

  • o 生成目标
  • E 只运行C预编译器(头文件,宏等展开)
  • S 表示程序编译期间,生成汇编语言文件后停止编译(.s文件)
  • c 取消链接步骤,编译源码并最后生成目标文件
  • Wall 打开编译告警

2.栗子

hello.c

#include<stdio.h>

int main(void)
{
    printf("Hello World n");
    return 0;
}
  • 预处理 gcc -E hello.c -o hello.i
  • 编译 gcc -S hello.i -o hello.s
  • 汇编 gcc -c hello.s -o hello.o
  • 链接 gcc hello.o -o hello

可使用 gcc hello.c -o hello,直接编译成可执行文件

结果:

zxm@zxm-pc:~/gcc$ ls
hello.c
zxm@zxm-pc:~/gcc$ gcc -E hello.c -o hello.i
zxm@zxm-pc:~/gcc$ gcc -S hello.i -o hello.s
zxm@zxm-pc:~/gcc$ gcc -c hello.s -o hello.o
zxm@zxm-pc:~/gcc$ gcc hello.o -o hello
zxm@zxm-pc:~/gcc$ ls
hello  hello.c  hello.i  hello.o  hello.s
zxm@zxm-pc:~/gcc$ ./hello 
Hello World

二、动态库编译与调用

1.编写动态库文件

func.c

#include <stdio.h>

void func(void)
{
    printf("test dynamic lib n");
}

2.编译为动态库

  • gcc -c func.c -o func.o -fPIC
  • gcc func.o -o libfunc.so -shared
zxm@zxm-pc:~/gcc/dynamic$ ls
func.c
zxm@zxm-pc:~/gcc/dynamic$ gcc -c func.c -o func.o -fPIC
zxm@zxm-pc:~/gcc/dynamic$ gcc func.o -o libfunc.so -shared
zxm@zxm-pc:~/gcc/dynamic$ ls
func.c  func.o  libfunc.so

3.调用动态库

main.c

#include <stdio.h>

void func(void);

int main(void)
{
    func();
    return 0;
}
  • gcc main.c -o main -L . -l func

需要把动态库文件放到 /usr/lib/ 目录下

结果:

zxm@zxm-pc:~/gcc/dynamic$ ls
func.c  func.o  libfunc.so  main.c
zxm@zxm-pc:~/gcc/dynamic$ gcc main.c -o main -L . -l func
zxm@zxm-pc:~/gcc/dynamic$ ls
func.c  func.o  libfunc.so  main  main.c
zxm@zxm-pc:~/gcc/dynamic$ ./main 
./main: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
zxm@zxm-pc:~/gcc/dynamic$ sudo cp libfunc.so /usr/lib
zxm@zxm-pc:~/gcc/dynamic$ ./main 
test dynamic lib

三、静态库编译与调用

1.编写静态库文件

func.c

#include <stdio.h>

void func(void)
{
    printf("test static lib n");
}

2.编译静态库文件

  • gcc -c func.c -o func.o
  • ar -crv libfunc.a func.o

结果:

zxm@zxm-pc:~/gcc/static$ ls
func.c
zxm@zxm-pc:~/gcc/static$ gcc -c func.c -o func.o
zxm@zxm-pc:~/gcc/static$ ar -crv libfunc.a func.o
a - func.o
zxm@zxm-pc:~/gcc/static$ ls
func.c  func.o  libfunc.a
zxm@zxm-pc:~/gcc/static$ rm -rf func.c func.o 
zxm@zxm-pc:~/gcc/static$ ls
libfunc.a

3.调用静态库

main.c

#include <stdio.h>

void func(void);

int main(void)
{
    func();
    return 0;
}
  • gcc main.c -o main -L . -l func
zxm@zxm-pc:~/gcc/static$ ls
libfunc.a  main.c
zxm@zxm-pc:~/gcc/static$ gcc main.c -o main -L . -l func
zxm@zxm-pc:~/gcc/static$ ls
libfunc.a  main  main.c
zxm@zxm-pc:~/gcc/static$ ./main 
test static lib