linux gcc 编译动态类库(.so)和静态类库(.a)

我的编译环境 ubuntu desktop 16.04

一:测试代码

测试有3个文件:AB.h,AB.c,test.c

//AB.h
void hello(); //AB.c
#include <stdio.h> void hello()
{
printf("hello from AB.c \n");
} //test.c
#include <stdio.h>
#include "AB.h" void main(void)
{
printf("it is main\n");
hello();
}

使用gcc, 编译运行,显示结果:

cocoa@ubuntu:~/Desktop/demo$ gcc AB.c test.c
cocoa@ubuntu:~/Desktop/demo$ ./a.out
it is main
hello from AB.c

二:gcc 编译静态类库 .a

//编译点o文件
cocoa@ubuntu:~/Desktop/demo$ gcc -c AB.c
//编译为AB.o文件
cocoa@ubuntu:~/Desktop/demo$ ls
AB.c AB.h AB.o a.out test.c
//打包成.a 文件
cocoa@ubuntu:~/Desktop/demo$ ar -crv libAB.a AB.o
a - AB.o
//编译测试程序,测试libAB.a
cocoa@ubuntu:~/Desktop/demo$ gcc -o testlibA test.c libAB.a
//测试程序 testlibA
cocoa@ubuntu:~/Desktop/demo$ ls
AB.c AB.h AB.o a.out libAB.a test.c testlibA
//运行测试,输出结果与上面一致
cocoa@ubuntu:~/Desktop/demo$ ./testlibA
it is main
hello from AB.c
cocoa@ubuntu:~/Desktop/demo$

三:gcc 编译动态类库 .so

//编译AB.c 为动态类库libAB.so
cocoa@ubuntu:~/Desktop/demo$ gcc -shared -o libAB.so -fPIC AB.c
//查看
cocoa@ubuntu:~/Desktop/demo$ ls
AB.c AB.h AB.o a.out libAB.a libAB.so test.c testlibA
//编译测试程序testSO,并链接当前目录下的libAB.so
cocoa@ubuntu:~/Desktop/demo$ gcc -o testSO test.c -lAB -L.
//设置一下动态类库路径
cocoa@ubuntu:~/Desktop/demo$ export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
//运行测试程序,结果与上述一致
cocoa@ubuntu:~/Desktop/demo$ ./testSO
it is main
hello from AB.c
cocoa@ubuntu:~/Desktop/demo$

对外提供,只需要把 AB.h 和libAB.a 或libAB.so 即可;

参考:http://www.cnblogs.com/ymy124/archive/2012/04/13/2446434.html

linux gcc 编译动态类库(.so)和静态类库(.a)的更多相关文章

  1. Linux gcc编译(动态库,静态库)

    1. linux 库路径: /lib , /usr/lib , /usr/local/lib 2.linux 编译静态库 a.编写源文件vi pr1.c void print1(){    print ...

  2. gcc 编译动态库和静态库

    Linux C 编程入门之一:gcc 编译动态库和静态库 cheungmine 2012 参考: C程序编译过程浅析 http://blog.csdn.net/koudaidai/article/de ...

  3. Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别

    昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [root@typecodes tcpmsg]# g ...

  4. Linux环境编译动态库和静态库总结

    对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...

  5. Linux gcc 编译日记

    gcc 编译器是众多编译器组合入口,例如在编译 .cpp 文件时,使用c++ 编译器,编译.c 文件时,使用c编译器. 在编译c++程序时, 库文件与头文件可通过 -L[dir] 指定库目录 , -l ...

  6. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  7. linux --> gcc编译之路径搜索

    gcc编译之路径搜索 头文件 --> 搜寻先从-I开始; --> 找gcc的环境变量 : C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PA ...

  8. Linux GCC编译警告:Clock skew detected. 错误解决办法

    今天在虚拟机上用GCC编译一个程序的时候,出现了下面的错误: make: warning: Clock skew detected. Your build may be incomplete 试了ma ...

  9. Linux Gcc编译错误(转载)

    转自:http://www.linuxidc.com/Linux/2012-01/52153.htm Linux系统下的c编程与Windows有所不同,如果你在用gcc编译代码的时候提示‘for’ l ...

随机推荐

  1. 2015 AlBaath Collegiate Programming Contest B

    Description Yaaaay, Haven't you heard the news? Bakaloria results are out! And Reem had very good gr ...

  2. vim基本使用

    i 进入插入状态 esc 退出插入状态 x 删除一个字符 dd 删除一行,并拷贝 yy 拷贝 p 粘贴 u 撤销 ctrl+r 重做 :w 保存 :q 退出 :q! → 退出不保存

  3. 预编译那些事#define后面只跟一个“参数”

    一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条件时对一组语句进行编译,而当条 ...

  4. [HDOJ5791]Two(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5791 题意:给两个数列,求有多少个公共子序列. dp(i,j)表示a1~ai和b1~bj的公共子序列个 ...

  5. sql注入在线检测(sqlmapapi)

    版权:http://blog.csdn.net/yueguanghaidao/article/details/38026431 每次看都不方便   摘抄下来 之前一搞渗透的同事问我,sqlmapapi ...

  6. QUEEN_BLADE_2D-非常屌-113P

    http://www.cgvoo.com/thread-33670-1-2.html http://blog.sina.com.cn/s/blog_4b92d6070102e7gj.html http ...

  7. Heap and HashHeap

    Heap 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很 ...

  8. 小C的故事(快速学C语言,,,极速版!)

    前几天这篇博客写了太多废话! 删啦~~. 本篇博客只是为chd A协的全嫩小鲜肉入门C语言的预科, 如果你在此处学习C语言, 不幸走火入魔, 小弱概不负责. //请直接随便找个C语言编译器,抄一下下面 ...

  9. lotusscript基本语法

    LotusScript是一种使用于Lotus Notes客户端程序或者是用于Domino服务器程序代理列表中的脚本语言.相当于用于网页中的脚本语言JavaScript.(JavaScript以可以用于 ...

  10. Yii 如何渲染另一控制器中的视图。

    (Yii)使用renderPartial调用另外一个控制器的视图 我们可以使用renderPartial访问存储在不同控制器的视图文件夹中的部分视图文件. 在Yii1.1.3中,我们使用双斜线“//” ...