gcc编译链接静态库、动态库

只编译不链接

gcc中,只编译不链接的参数为-c。
编写一个最简单的hello world程序。

// filename hello.c
#include<stdio.h>
int main()
{
  printf("hello world!\n");
  return 0;
}

编译一下:

gcc -c hello.c

得到 hello.o 文件。.o是object文件的意思。不可以执行。
用-o编译链接一下:

gcc -o hello hello.c
./hello

成功运行,最后使用 ldd 命令查看hello依赖的动态库。

依赖

你也可以使用--static命令把这些库全部静态链接进来,静态链接进来的会巨大无比:
对比

静态链接的依赖

编译链接静态库

我们举一个简单的例子进行演示。子函数分别实现加减和乘除的功能,主函数调用这些函数。

编译静态库

  1. 先写一下实现加减功能的子函数。主函数要调用另一个c文件里面的函数,一般是通过共同包含同一个.h文件实现的。
// filename add_minus.h
#ifndef __ADD_MINUS_H__
#define __ADD_MINUS_H__

int add(int a, int b); 
int minus(int a, int b); 

#endif /*__ADD_MINUS_H__*/

// filename add_minus.c
#include"add_minus.h"
int add(int a, int b)
{
  return a+b;
}
int minus(int a, int b)
{
  return a-b;
} 


  1. 主函数:
#include<stdio.h>
#include"add_minus.h"
int main()
{
  printf("hello\n");
  printf("%d\n",add(1,2));
  printf("%d\n",minus(1,2));
  return 0;
}
  1. 编译静态库
    假设我们需要把 add_minus.o 里面包含的 add 和 minus 编译为静态库,只需要对.o文件执行以下命令:
ar rc libadd_minus.a add_minus.o
  • 外传
    各自编译一下,最后链接
    (这只是个小插曲,说明多个.o文件只需要链接一下就可以生成可执行文件)
gcc -c main.c
gcc -c add_minus.c
gcc -o main main.o add_minus.o
./main

链接静态库

上节的1~3已经得到了libadd_minus.a和main.o文件,这一步需要把这两个文件链接起来

gcc -o main2 main.o -L./ -ladd_minus

说明1:-L./表明库文件位置在当前文件夹

说明2: -ladd_minus 表示链接 libadd_minus.a 文件,使用“-l”参数时,前缀“lib”和后缀“.a”是需要省略的。

编译链接动态库

编译动态库

  1. 先写一下实现乘除功能的子函数,其余同上。
// filename multi_div.h
#ifndef __MULTI_DIV_H__
#define __MULTI_DIV_H__

int multi(int a, int b); 
int div(int a, int b); 

#endif /*__MULTI_DIV_H__*/
// filename multi_div.c
#include "multi_div.h"

int multi(int a, int b)
{
    return a*b;
}

int div(int a, int b)
{
    return a/b;
}
  1. 主函数:
#include <stdio.h>
#include "add_minus.h"
#include "multi_div.h"

int main(void)
{
int rst;

printf("Hello Cacu!\n");
        rst = add(3,2);
        printf("3 + 2 = %d\n",rst);

        rst = minus(3,2);
        printf("3 - 2 = %d\n",rst);
rst = multi(3,2);
printf("3 * 2 = %d\n",rst);

rst = div(6,2);
printf("6 / 2 = %d\n",rst);

return 0;
}
  1. 编译静态库
    假设我们需要把 multi_div.o 里面包含的 multi 和 div 编译为静态库,需要使用gcc:
gcc multi_div.c -fPIC -shared -o libmulti_div.so

链接动态库

  1. 在外部告诉程序,动态库在哪里
    有两种方法:
  • 将 libmulti_div.so copy到/lib/ 或 /usr/lib/ 下
    这个方法对很多软件都要使用的库比较友好
  • 在 LD_LIBRARY_PATH 变量中指定库文件路径
    这个一般就是临时弄一下。用法:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/yourpath
  1. 编译链接
gcc -o main4 main.o -L./ -ladd_minus -lmulti_div
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容