对Linux环境动态库和静态库的一些基础知识做一些总结,

首先总结静态库的编译步骤。

1 先基于.cpp或者.c文件生成对应的.o文件

2将几个.o文件 使用ar -cr命令 生成libname.a文件

libname.a 为静态库, name 为静态库的名字,

可以根据模块功能命名。

举个例子

在当前目录下,有一个mymethod.h文件

在mymethod.cpp里实现这两个函数

在当前目录下有一个main.cpp文件

为了方便使用,将mymethod.cpp封装成静态库和动态库

首先将mymethod.cpp 编译成目标文件

 g++ -c mymethod.cpp -o mymethod.o

然后根据目标文件生成静态库

ar -cr libmymethod.a mymethod.o

ar命令可以用来创建、修改库,也可以从库中提出单个模块

-c 选项表示 创建一个库。不管库是否存在,都将创建

-r 选项表示 将模块插入库,如果库中有对应的模块,那么进行更新

如果把多个.o文件插入库.a里,只需要在后面用空格分开写出来

格式

ar -cr 静态库libname.a  name1.o name2.o

静态库的命名有规则,格式为lib+库名+.a

生成静态库libmymethod.a后,

编译main.cpp 连接静态库生成可执行文件main

 g++ main.cpp -o main -I ./ -L ./ -lmymethod

-I选项表示头文件路径

-L表示静态库或者动态库的路径

链接静态库写成 -l库名即可:-lmymethod

运行./main 可以输出结果

下面是动态库的编译

动态库的命名是lib+库名+.so

动态库需要使用-shared 选项以及-fPIC选项

g++ -c  -fPIC mymethod.cpp -o mymethod.o

-fPIC表示代码是和地址无关的,不需要被不同模块重定位

然后根据目标文件生成动态库.so文件

g++ -shared -o libmymethodso.so mymethod.o

-shared 选项表示生成的是.so动态库文件

下一步是链接动态库

 g++ main.cpp -o main -I ./ -L ./ -lmymethodso

此时不能直接运行./main否则会提示找不到对应的动态库

上面的步骤可以直接写成一句话

g++ -shared -fPIC mymethod.cpp -o libmymethodso.so

我们现在有几种方式配置动态库的路径

第一种

export LD_LIBRARY_PATH="./:$LD_LIBRARY_PATH"

这种方式将动态库路径配置到LD_LIBRARY_PATH,只是暂时生效

第二种

使用 ldconfig 机制(需 root 权限):
● 首先,在 /etc/ld.so.conf.d/ 下创建一个 .conf 文件,
如 libmymethod.conf ,内容为共享库所在目录的绝对路径
● 然后,运行 ldconfig

 

第一种比较简单,配置好后可以直接运行./main

第二种按照操作进入/etc/ld.so.conf.d/,

然后创建mymethod.conf

 

用vi打开mymethod.conf,添加动态库的绝对路径

/home/secondtonone/soando

最后运行ldconfig, 即可生效了。

这样就可以运行./main

现在对动态库路径配置做一个总结

解决共享库路径问题
 gcc/g++ 编译期 :
● 使用 ­L 选项指定所需链接的共享库所在目录(如果共享库或其连
接文件位于 /usr/lib 、 /usr/local/lib 或由 LD_LIBRARY_PATH 指定
的目录下,则不需指定该选项)
● 使用 ­l 选项指定所需链接的共享库名称(无前缀、后缀)
 程序运行期:
● 使用 LD_LIBRARY_PATH 环境变量来指定所需引用的共享库所在
目录 ( 临时指定或永久性写入相关文件,普遍适用于 UNIX 世界 )
● 使用 ldconfig 机制(需 root 权限):
● 首先,在 /etc/ld.so.conf.d/ 下创建一个 .conf 文件,
如 libmymethod.conf ,内容为共享库所在目录的绝对路径
● 然后,运行 ldconfig

我的公众号,谢谢关注下。

Linux环境编译动态库和静态库总结的更多相关文章

  1. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  2. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  3. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  4. 嵌入式 Linux下编译并使用curl静态库

    #x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...

  5. [转][linux][centos]嵌入式 Linux下编译并使用curl静态库

    #x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...

  6. 自己在linux上编译、链接、动态库和静态库的学习笔记

    在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些 ...

  7. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  8. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  9. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

随机推荐

  1. Visionpro学习网

    重码网是一个在线机器视觉学习网站,推出了Halcon,Visionpro机器视觉学习视频教程,视频内容通俗易懂,没有编程基础的同学,照着视频练习,也同样可以学会. 学机器视觉,拿高薪,成就技术大拿.重 ...

  2. Kafka安装之三 spring-kafka实践

    一.spring-kafka配置详解 1.1 要是用spring-kafka 我们首先要在pom要.xml中引入spring-kafka包 <dependencies> <depen ...

  3. ubuntu 设置全局代理

    ubuntu配置shadowsocks全局代理 在mac.window平台下都有shadowsocks客户端,因此这两个平台不叙述太多,现在介绍ubuntu下的配置方法. 1.安装python lin ...

  4. Linux下的计算器(bc、expr、dc、echo、awk)知多少?

    linux 其他知识目录 原文链接:http://blog.chinaunix.net/uid-24673811-id-1760837.html linux下的三个命令可以用来作计算,下面一一讲解用法 ...

  5. ffmpe安装

    原文:https://www.jianshu.com/p/905df3d9e753 下载安装 下载最新源码包并解压 $ wget http://ffmpeg.org/releases/ffmpeg-3 ...

  6. 按照Right-BICEP要求设计四则运算3程序的单元测试用例

    按照Right-BICEP要求: Right——结果是否正确? B——是否所有的边界条件都是正确的? I——能查一下反响关联吗? C——能用其它手段交叉检查一下吗? E——你是否可以强制错误条件发生? ...

  7. 类的static成员变量和成员函数能被继承吗

    1.   父类的static变量和函数在派生类中依然可用,但是受访问性控制(比如,父类的private域中的就不可访问),而且对static变量来说,派生类和父类中的static变量是共用空间的,这点 ...

  8. 3dContactPointAnnotationTool开发日志(二九)

      今天想着在Windows平台上跑通那个代码,不过它的官网上写的支持平台不包括windows,但我还是想试试,因为看他的依赖好像和平台的关系不是特别大.   看了下它的py代码,不知道是py2还是p ...

  9. inline函数的总结

    在函数返回类型前加上关键字inline就可以将函数指定为内联函数: inline const string& shortString(const string &s1, const s ...

  10. 【前端学习笔记】函数定义、函数调用、this

    函数定义的三种方式与特点: 1.函数声明:(特点:会被前置:重复定义函数时,最后一次定义有效.) 2.函数表达式: 3.函数实例化:(特点:只能访问本地作用域与全局作用域!!!) /* 对象实例化定义 ...