Linux库多重依赖
源文件:
//world.cpp
#include <stdio.h> void world(void)
{
printf("world.\n");
}
//hello.cpp
#include <stdio.h> void world(void); void hello(void)
{
printf("hello\n");
world();
}
//test.cpp void hello(void); int main(void)
{
hello();
return ;
}
一、动态库多重依赖
(1)编译word动态库
g++ -shared -fPIC world.cpp -o libworld.so
(2)编译hello动态库
g++ -shared -fPIC hello.cpp -o libhello.so
ldd libhello.so
查看libhello.so的依赖库,没有看到依赖libword.so

g++ -shared -fPIC hello.cpp -o libhello.so -L ./ -lworld
ldd libhello.so
再次查看libhello.so的依赖库,看到了依赖库libword.so

上图显示libworld.so not found,如果临时增加链接动态库的路径,输入如下命令
export LD_LIBRARY_PATH=./
ldd libhello.so
查看libhello.so的依赖库,显示了依赖库libword.so的路径

先清除链接动态库路径
export LD_LIBRARY_PATH=
(3)编译可执行文件test
g++ test.cpp -o a.out -L ./ -lhello
提示找不到libhello.so的依赖库libworld.so,即使编译libhello.so时已经指定了libworld.so,这点和windows不一样

g++ test.cpp -o a.out -L ./ -lhello -lworld -Wl,-rpath ./
编译通过,得到可执行文件a.out,运行成功
二、动态库静态库多重依赖
(1)编译word静态库
g++ -c world.cpp
ar -cr libworld.a world.o
(2)编译hello动态库
g++ -shared -fPIC hello.cpp -o libhello.so -L ./ -lworld

编译报错,因为world也必须使用-fPIC,重新编译

(3)编译可执行文件
g++ test.cpp -o a.out -L ./ -lhello -Wl,-rpath ./

三、静态库多重依赖
(1)编译world静态库
g++ -c world.cpp
ar -cr libworld.a world.o
(2)编译hello静态库
g++ -c hello.cpp
ar -cr libhello.a hello.o
(3)编译可执行文件
g++ test.cpp -o a.out -L ./ -lworld -lhello

因为静态库的依赖有顺序,被调用库应该放在调用库后面,动态库没有依赖顺序,正确输入如下
g++ test.cpp -o a.out -L ./ -lhello -lworld
(4)静态库包含静态库

Linux库多重依赖的更多相关文章
- Linux 下动态库 / 静态库(依赖)
一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...
- linux库文件编写入门(笔记)
linux库文件的编写 作者: laomai地址: http://blog.csdn.net/laomai 本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用&quo ...
- Linux库文件路径的添加
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...
- 查看linux库文件32位还是64位
查看linux库文件32位还是64位 分类: linux2014-09-25 09:46 238人阅读 评论(0) 收藏 举报 objdump -a *.a objdump -a *.so
- golang 标准库间依赖的可视化展示
简介 国庆看完 << Go 语言圣经 >>,总想做点什么,来加深下印象.以可视化的方式展示 golang 标准库之间的依赖,可能是一个比较好的切入点.做之前,简单搜了下相关的内 ...
- 解决linux安装软件依赖的曲线救国方案
相信大家在一台无法连接外网的linux上安装软件时,对于软件依赖的安装,都会特别头疼,因为软件依赖的安装,不论是其数量,还是安装的复杂度都比软件本身要高出一个维度! 今天就和大家分享一个,解决linu ...
- Linux库的创建和使用
Linux库的概念 库是一种软件组建技术,里面封装了数据和函数,提供给用户程序调用.使用库能够使程序模块化,提高编译速度,实现代码重用,易于升级. Windows系统提供了大量静态链接库(.lib)和 ...
- VisualGDB系列11:Linux C++项目中使用外部Linux库
根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 在<使用VS创建Linux静态库和 ...
- linux 库文件配置
linux 库文件配置 /etc/ld.so.conf 或 /etc/ld.so.conf.d/*.conf
随机推荐
- C#如何使SQLite程序集既能适应32位系统也能适应64位系统
分享5: 需求:都知道Sqlite3是分32位和64位版本的,那如果将一个Sqlite3.dll文件全适用 分析:Sqlite是种轻量级的数据库文件,使用了混合编程而成的,一部分采用非托管的C++代码 ...
- 安装Cnario Player 3.8.1.156或其他版本时提示"Warning 4154. Adobe Flash Player 13 ...not correctly installed"
错误提示 安装Cnario Player 3.8.1.156或其他版本时, 有时会出现如下提示: Warning 4154. Adobe Flash Player 13 ...not correctl ...
- Q_UNUSED 的使用
在构建比较大型的工程的时候,若继承,重构虚函数,写数据model等等比较多的时候,会给出大量的 “未引用的形参” ,“warning: unused parameter ” 的告警.这种告警多了会影 ...
- 解决Ajax请求后台Servlet接口拿不到JSON数据问题
前端Ajax请求代码如下: window.onload=function() { var url='http://127.0.0.1:8080/testpj/ErrorlogServlet'; $.a ...
- [Windows Server]Windows Server turn off screen auto-lock to fit scheduled tasks(Error Code :0x4F7) / 关闭Windows Server的自动锁定来解决计划任务0x4F7错误
1. 打开“运行”,输入“regedit” 并回车. 2. 找到以下注册表路径,将Attributes的值改为 2: (原为1 HKEY_LOCAL_MACHINE \SYSTEM \CurrentC ...
- Java EE Expression Language
什么是EL? 形如这样(立即执行的): ${sessionScope.cart.total} 或者这样(延迟执行的): #{customer.name} 的表达式语言(Expression Langu ...
- sqlserver建立远程查询
开始远程查询前: ----open:Ad Hoc Distributed QueriesEXEC sp_configure 'show advanced options',1reconfigureex ...
- postgreSQL可视化工具pgAdmin3 导入表结构和数据
材料:.backup文件.postgreSQL(pgAdmin3) 1.新建一个数据库2.选中数据库右键还原,弹出框中选择本地计算机备份文件路径---->点击还原(选择一个修改时间最早和最晚的还 ...
- Python之file
读写文件 代码: #读写文件str = """i love China!!i hope everyone save"""#打开并书写文件f ...
- Django mysql应用
环境:python3.Django2 1.安装驱动mysqlclient pip3 install mysqlclient 2.创建一个数据库 CREATE DATABASE database_nam ...