linux gcc 编译动态类库(.so)和静态类库(.a)
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)的更多相关文章
- Linux gcc编译(动态库,静态库)
1. linux 库路径: /lib , /usr/lib , /usr/local/lib 2.linux 编译静态库 a.编写源文件vi pr1.c void print1(){ print ...
- gcc 编译动态库和静态库
Linux C 编程入门之一:gcc 编译动态库和静态库 cheungmine 2012 参考: C程序编译过程浅析 http://blog.csdn.net/koudaidai/article/de ...
- Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别
昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [root@typecodes tcpmsg]# g ...
- Linux环境编译动态库和静态库总结
对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...
- Linux gcc 编译日记
gcc 编译器是众多编译器组合入口,例如在编译 .cpp 文件时,使用c++ 编译器,编译.c 文件时,使用c编译器. 在编译c++程序时, 库文件与头文件可通过 -L[dir] 指定库目录 , -l ...
- GCC编译过程与动态链接库和静态链接库
1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...
- linux --> gcc编译之路径搜索
gcc编译之路径搜索 头文件 --> 搜寻先从-I开始; --> 找gcc的环境变量 : C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PA ...
- Linux GCC编译警告:Clock skew detected. 错误解决办法
今天在虚拟机上用GCC编译一个程序的时候,出现了下面的错误: make: warning: Clock skew detected. Your build may be incomplete 试了ma ...
- Linux Gcc编译错误(转载)
转自:http://www.linuxidc.com/Linux/2012-01/52153.htm Linux系统下的c编程与Windows有所不同,如果你在用gcc编译代码的时候提示‘for’ l ...
随机推荐
- 2016年7月2日 星期六 --出埃及记 Exodus 14:29
2016年7月2日 星期六 --出埃及记 Exodus 14:29 But the Israelites went through the sea on dry ground, with a wall ...
- spring webmvc使用ResponseBody前,在配置文件中的配置
spring的版本不同, 导致配置引用地址不同 首先引用一个jar包 <dependency> <groupId>com.fasterxml.jackson.core</ ...
- repo 官方教程
参考 http://android.git.kernel.org/repo http://source.android.com/source/downloading.html http://sourc ...
- iOS奔溃日志总结
1,http://www.cnblogs.com/qingjoin/p/3515902.html 2,http://blog.csdn.net/u012269653/article/details/4 ...
- ASP.NET导入导出
//创建一个数据链接 // string strCon =" Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0} ;Extended Prope ...
- FreeSWITCH的TLS加密
听着很高大上(实际也很实用)的加密机制,在FreeSWITCH里配置支持竟然这么简单! Greate FreeSWITCH and Greate Programmer! ① cd /usr/local ...
- Populating Tabular Data Block Manually Using Cursor in Oracle Forms
Suppose you want to populate a non-database data block with records manually in Oracle forms. This t ...
- C#正则表达式编程(三):Match类和Group类用法
前面两篇讲述了正则表达式的基础和一些简单的例子,这篇将稍微深入一点探讨一下正则表达式分组,在.NET中正则表达式分组是用Match类来代表的.首先先看一段代码: /// <summary> ...
- JavaScript算法题之–随机数的生成
JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2 ...
- iOS - OC SingleClass 单例类
前言 单例对象能够被整个程序所操作.对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到. 特点: 在内存中只有一个实例 提供一个全局的访问点 ...