linux下gcc编译器 链接静态库,gcc编译链接静态库、动态库

只编译不链接

gcc中,只编译不链接的参数为-c。

编写一个最简单的hello world程序。

// filename hello.c

#include

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依赖的动态库。

5ee9d6f93522

依赖

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

5ee9d6f93522

对比

5ee9d6f93522

静态链接的依赖

编译链接静态库

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

编译静态库

先写一下实现加减功能的子函数。主函数要调用另一个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;

}

主函数:

#include

#include"add_minus.h"

int main()

{

printf("hello\n");

printf("%d\n",add(1,2));

printf("%d\n",minus(1,2));

return 0;

}

编译静态库

假设我们需要把 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”是需要省略的。

编译链接动态库

编译动态库

先写一下实现乘除功能的子函数,其余同上。

// 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;

}

主函数:

#include

#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;

}

编译静态库

假设我们需要把 multi_div.o 里面包含的 multi 和 div 编译为静态库,需要使用gcc:

gcc multi_div.c -fPIC -shared -o libmulti_div.so

链接动态库

在外部告诉程序,动态库在哪里

有两种方法:

将 libmulti_div.so copy到/lib/ 或 /usr/lib/ 下

这个方法对很多软件都要使用的库比较友好

在 LD_LIBRARY_PATH 变量中指定库文件路径

这个一般就是临时弄一下。用法:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/yourpath

编译链接

gcc -o main4 main.o -L./ -ladd_minus -lmulti_div

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值