Linux 环境下 gcc 链接库 编译、链接(概览) 以及 自动化工具Ma
个人博客首页(点击查看详情) -- https://blog.51cto.com/11495268
? 1、简介 ????程序编译一般需要经预处理、编译、汇编和链接,在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为 "库" 文件,本文 主要 描述 Linux 平台下 库文件的 创建 和 链接 相关操作(既然都看 这么底层的内容了,相信 也有一定的基础,所以本文 对相关命令 也不会进行详细解释) ???? 备注: ????linux平台下,静态链接库是以 .a 的后缀文件,动态链接库是以 .so 的后缀文件 ????widows平台下,静态链接库是以 .lib 的后缀文件,动态库文件是以 .dll 的后缀文件 ???? 2、库文件 2.1 静态库 2.1.2 原理 ???? 2.1.3 特点 2.1.4 创建流程 ???? 备注: 2.1.5 命令规则 2.2 动态库 2.2.2 原理 ???? 2.2.3 特点 2.2.4 创建 # gcc -fPIC -shared -o libxxx.so xx1.c xx2.c xx3.c ???? 2.2.5 命名规则 3、库文件 编译、链接(实战操作) # cat gcc_lib_header.h #ifndef __GCC_LIB_HEADER_H_ #define __GCC_LIB_HEADER_H_ #include <stdio.h> void gcc_lib_one(); void gcc_lib_two(); void gcc_lib_three(); #endif ???? # cat gcc_lib_first.c /* filename : gcc_lib_first.c */ #include "gcc_lib_header.h" void gcc_lib_one(){ printf("call gcc_lib_one() functionn"); } ???? # cat gcc_lib_sec.c /* filename : gcc_lib_sec.c */ #include "gcc_lib_header.h" void gcc_lib_two(){ printf("call gcc_lib_two() functionn"); } ???? # cat gcc_lib_third.c /* filename : gcc_lib_third.c */ #include "gcc_lib_header.h" void gcc_lib_three(){ printf("call gcc_lib_three() functionn"); } ???? # cat gcc_lib_main.c /* filename : gcc_lib_main.c */ #include "gcc_lib_header.h" int main(int argc,char *argv[]) { gcc_lib_one(); gcc_lib_two(); gcc_lib_three(); return 0; } ???? 3.1.2 静态库 编译 # gcc -c gcc_lib_first.c # gcc -c gcc_lib_sec.c # gcc -c gcc_lib_third.c # ar cqs libstatic_gcc.a gcc_lib_first.o gcc_lib_sec.o gcc_lib_third.o ???? 3.1.3 静态库 链接 ## -L ./ 等同于 -L. # gcc -o gcc_lib_main_static gcc_lib_main.c -L. -static -l static_gcc # ./gcc_lib_main_static call gcc_lib_one() function call gcc_lib_two() function call gcc_lib_three() function ???? 3.2 动态库 编译、链接 3.1.2 动态库 编译 # gcc -fPIC -shared -o libdynamic_gcc.so gcc_lib_first.c gcc_lib_sec.c gcc_lib_third.c ???? 3.1.3 动态库 链接 # gcc -o gcc_lib_main_dynamic gcc_lib_main.c -L ./ -l dynamic_gcc ???? 3.1.4 共享路径设置(不详细解释) ## 共享路径设置 : ## [email?protected]:LD_LIBRARY_PATH 修改 这个全局变量 ## [email?protected]:修改 /etc/ld.so.conf 配置 ## 本文 就 详细描述了,直接把 生成的共享库 cp 至 系统默认路径下 # cp libdynamic_gxx.so /usr/local/lib/ ## 重新读取 库文件信息(需root用户执行) # ldconfig ???? 备注: 3.1.5 执行 ## 查看 依赖库,没有问题 就执行 # ldd gcc_lib_main_dynamic linux-vdso.so.1 => (0x00007fff241e9000) libdynamic_gcc.so => /usr/local/lib/libdynamic_gcc.so (0x00007fe587990000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe5875c6000) /lib64/ld-linux-x86-64.so.2 (0x000055b1d62ea000) # ./gcc_lib_main_dynamic call gcc_lib_one() function call gcc_lib_two() function call gcc_lib_three() function ???? 4、自定义工具(Makefile) # apt-get install make ???? 4.2 编写 Makefile # cat Makef default_target : help help : @echo "usage : make [opt]" @echo "topt arguement is one of "static_gcc、dynamic_gcc"" gcc_lib_first.o : gcc_lib_first.c gcc_lib_header.h gcc -c gcc_lib_first.c gcc_lib_sec.o : gcc_lib_sec.c gcc_lib_header.h gcc -c gcc_lib_sec.c gcc_lib_third.o : gcc_lib_third.c gcc_lib_header.h gcc -c gcc_lib_third.c static_gcc : gcc_lib_first.o gcc_lib_sec.o gcc_lib_third.o ar cqs /tmp/libstatic_gcc.a gcc_lib_first.o gcc_lib_sec.o gcc_lib_third.o gcc -o gcc_lib_main_static gcc_lib_main.c -L /tmp -static -l static_gcc dynamic_gcc : gcc -fPIC -shared -o /tmp/libdynamic_gcc.so gcc_lib_first.c gcc_lib_sec.c gcc_lib_third.c gcc -o gcc_lib_main_dynamic gcc_lib_main.c -L /tmp -l dynamic_gcc cp /tmp/libdynamic_gcc.so /usr/local/lib/ ldconfig ???? 4.3 执行 ## 创建 静态库 链接的 可执行文件 # make static_gcc ar cqs /tmp/libstatic_gcc.a gcc_lib_first.o gcc_lib_sec.o gcc_lib_third.o gcc -o gcc_lib_main_static gcc_lib_main.c -L /tmp -static -l static_gcc ## 创建 动态库 链接的 可执行文件 # make dynamic_gcc gcc -fPIC -shared -o /tmp/libdynamic_gcc.so gcc_lib_first.c gcc_lib_sec.c gcc_lib_third.c gcc -o gcc_lib_main_dynamic gcc_lib_main.c -L /tmp -l dynamic_gcc cp /tmp/libdynamic_gcc.so /usr/local/lib/ ldconfig (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |