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依赖的动态库。
依赖
你也可以使⽤--static命令把这些库全部静态链接进来,静态链接进来的会巨⼤⽆⽐:
对⽐
静态链接的依赖
编译链接静态库
我们举⼀个简单的例⼦进⾏演⽰。⼦函数分别实现加减和乘除的功能,主函数调⽤这些函数。
编译静态库
先写⼀下实现加减功能的⼦函数。主函数要调⽤另⼀个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”是需要省略的。编译链接动态库linux下gcc编译的四个步骤
编译动态库
先写⼀下实现乘除功能的⼦函数,其余同上。
// 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。