只编译不链接
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”是需要省略的。
编译链接动态库
编译动态库
先写一下实现乘除功能的子函数,其余同上。
// 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