gcc 编译动态库及链接
2017-02-04 13:19
197 查看
1.testa.c
[cpp]
view plain
copy
#include <stdio.h>
void Test_a()
{
printf("This is Test_a!");
}
2. testb.c
[cpp]
view plain
copy
#include <stdio.h>
void Test_b()
{
printf("This is Test_b!");
}
3. testc.c
[cpp]
view plain
copy
#include <stdio.h>
void Test_c()
{
printf("This is Test_c!");
}
4. testh.h
[cpp]
view plain
copy
void Test_a();
void Test_b();
void Test_c();
5. main.c
[cpp]
view plain
copy
#include "testh.h"
int main()
{
Test_a();
Test_b();
Test_c();
return 0;
}
现在,我们将三个test函数编译为一个动态库,使用一下命令:
[plain]
view plain
copy
gcc -fPIC -shared testa.c testb.c testc.c -o libtest.so
生成了libtest.so文件,其中,命令中
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
然后,通过通过命令
[plain]
view plain
copy
gcc main.c -L. -ltest -omain
编译生成应用程序main,其中命令中
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
我们知道一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤。当然linux中动态链接也是经过这三个过程。Linux 使用这个ld-linux.so*中的来装载(其实这只是一个链接)其他库。所以这个库必须放在linux中/lib下。对于其他,通常我们共享库放在/lib这个路径下,而且也是系统默认的搜索路径。
Linux共享库的搜索路径先后顺序:
1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3、配置文件/etc/ld.so.conf中指定的动态库搜索路径
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径 /usr/lib
此处,我们使用了第2中方法来使用该动态库,先执行以下命令,设置LD_LIBRARY_PATH的值
[plain]
view plain
copy
export LD_LIBRARY_PATH=.
之后,使用一下命令即可
[plain]
view plain
copy
./main
[cpp]
view plain
copy
#include <stdio.h>
void Test_a()
{
printf("This is Test_a!");
}
2. testb.c
[cpp]
view plain
copy
#include <stdio.h>
void Test_b()
{
printf("This is Test_b!");
}
3. testc.c
[cpp]
view plain
copy
#include <stdio.h>
void Test_c()
{
printf("This is Test_c!");
}
4. testh.h
[cpp]
view plain
copy
void Test_a();
void Test_b();
void Test_c();
5. main.c
[cpp]
view plain
copy
#include "testh.h"
int main()
{
Test_a();
Test_b();
Test_c();
return 0;
}
现在,我们将三个test函数编译为一个动态库,使用一下命令:
[plain]
view plain
copy
gcc -fPIC -shared testa.c testb.c testc.c -o libtest.so
生成了libtest.so文件,其中,命令中
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
然后,通过通过命令
[plain]
view plain
copy
gcc main.c -L. -ltest -omain
编译生成应用程序main,其中命令中
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
我们知道一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤。当然linux中动态链接也是经过这三个过程。Linux 使用这个ld-linux.so*中的来装载(其实这只是一个链接)其他库。所以这个库必须放在linux中/lib下。对于其他,通常我们共享库放在/lib这个路径下,而且也是系统默认的搜索路径。
Linux共享库的搜索路径先后顺序:
1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3、配置文件/etc/ld.so.conf中指定的动态库搜索路径
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径 /usr/lib
此处,我们使用了第2中方法来使用该动态库,先执行以下命令,设置LD_LIBRARY_PATH的值
[plain]
view plain
copy
export LD_LIBRARY_PATH=.
之后,使用一下命令即可
[plain]
view plain
copy
./main
相关文章推荐
- 【linux c开发】GCC 编译链接后找不到动态库
- GCC 编译动态库 so文件时,静态链接libmysqlclient.a 与动态链接参数一起使用问题。
- gcc编译链接动态库详解
- GCC/LD编译链接潜规则 (第四弹) : ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到(导致生产环境加载失败)
- GCC 编译动态库及引用库 &&动态链接库的编译链接
- gcc链接g++编译生成的静态库和动态库的makefile示例
- gcc 编译链接生成sqlite动态库和静态库
- gcc链接g++编译生成的静态库和动态库的makefile示例
- [转]GCC编译的背后( 预处理和编译 汇编和链接 )
- Gcc 中的编译和链接
- GCC编译的背后( 预处理和编译 汇编和链接 )
- Linux下如何用GCC编译动态库
- gcc 链接(-l, -L)和编译(-include, -I)参数
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 编译与链接的问题 gcc -fPIC -shared
- 用gcc编译静态库,动态库
- Linux下如何用GCC编译动态库
- GCC编译的背后( 预处理和编译 汇编和链接)
- Linux编译链接问题----静态库和动态库
- Linux下如何用GCC编译动态库