Linux程序设计中,动态库/共享库(*.so)的查找方式小结

MOS管热阻的测量方法 实验室内如何测试mos管热阻 阅读详情
在Linux程序设计中,动态库的查找体现在两个方面:
- 编译链接程序
- 加载运行程序

以下按照动态库所处位置的不同,逐一说明其查找方式。

1 动态库位于系统默认的动态库目录 /lib 或 /usr/lib(64位系统为/lib64、/usr/lib64)

编译程序时用 -l 参数链接动态库,运行时无需任何设置。

注意:动态库必须遵循 libxx.so 的命名方式。

2 动态库位于用户程序目录,或者是其相对目录。有两种查找方式:

方式一

编译时直接指定动态库(使用相对路径)作为输入文件,例如:
gcc -o run ./lib/mylib.so main.o

运行时保证动态库的相对位置不变,直接运行即可。

注意:
- 如果动态库位于用户程序目录,其相对路径要用 ./mylib.so 的方式。如果省略 ./ ,程序在运行时将去系统默认的动态库目录(/lib、/usr/lib)查找库文件。
- 动态库不必遵循 libxx.so 的命名方式。

方式二

编译时用 -L 参数指定动态库路径,用 -l 参数链接动态库,例如:
gcc -o run -L./lib/ -lmy main.o

运行时通过环境变量 LD_LIBRARY_PATH 指定动态库路径(建议使用绝对路径),例如:
LD_LIBRARY_PATH=/home/test/demo/lib ./run

注意:动态库必须遵循 libxx.so 的命名方式。
【OpenClaw从入门到精通】第01篇:保姆级教程——从零开始搭建你的第一个本地AI助理(2026实测版) 本文聚焦2026年开源AI代理工具OpenClaw的本地部署与实操,从核心概念拆解入手,先厘清OpenClaw、Gateway、Skills、ClawHub的关联,再明确硬件系统要求与大模型API-Key准备要点,通过官方一键安装脚本完成本地部署,并配置阿里云百炼API实现大模型对接。以“让AI助理抓取开源中国热门项目”的虚拟实战案例,详细演示Skills调用流程,同时梳理部署中“命令找不到”“API-Key配置失败”等高频问题的解决方法。内容兼顾新手友好性与实操参考性,所有步骤均基于公开技术文档验证。 阅读详情

相关推荐

SpringBoot Actuator未授权访问漏洞实战:从发现到利用

本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。

weixin_29231221的博客 259

【Linux】 Linux 平台如何查看SO符号表

该命令会输出共享库中的所有符号列表,包括函数和变量,以及它们的地址和类型等信息。需要注意的是,共享库中的符号可能会被重命名或隐藏,以避免命名冲突和符号泄露等问题,因此需要遵循一定的规范来管理共享库中的符号。表示要查看的共享库文件名,可以是绝对路径或相对路径。命令来查看一个共享库(也称为动态链接库或。文件)中的符号(函数或变量)列表。在 Linux 平台上,可以使用。(显示 C++ 符号名)和。表示选项,常用的选项有。(显示调试符号表)等;(显示动态符号表)、

Michael 6420

LaTeX公式转Word竟这么简单?Python三行代码实现学术论文格式无忧

本文介绍如何利用Python的latex2word库,仅需三行代码即可将LaTeX数学公式精准转换为Word原生Office Math对象,解决学术写作中LaTeX与Word格式割裂的难题。该方法支持批量处理、格式保真,并能与Markdown、Jupyter Notebook等工具集成,构建自动化写作流程,实现学术论文格式无忧。

qsc90123456的博客 295

Linux C/C++ 共享库so的搜索路径和顺序

共享库的搜索 共享库的搜索出了系统默认路径外,还可以通过下面方法指定。首先通过环境变量指定: 环境变量 LIBRARY_PATH 编译期查找动态链接库路径, 导出给Makefile或者在Makefile开头指定; LD_LIBRARY_PATH 运行期查找动态链接库的路径,会在系统默认路径之前查找; 还可以通过GCC参数指定: 编写Makefile一个好的习惯是先-L指定路...

Life runs on code 5286

自动驾驶必备:5分钟搞懂gPTP如何实现μs级时间同步(附开源代码)

本文深入解析了gPTP协议在自动驾驶系统中实现微秒级时间同步的核心机制与工程实践。针对多传感器融合与跨域协同的严苛需求,文章拆解了gPTP的频率同步、对等延迟测量与时间偏移校正三步流程,并提供了基于linuxptp和AVnu gPTP两大开源代码库的实战配置指南与性能评估方法,助力开发者构建高精度、高可靠的车载时间同步网络。

weixin_29211309的博客 167

Arthas实战(3)- CPU使用率高问题排查

Arthas实战(3)- CPU使用率高问题排查

java_liuyuan的博客 1731

【linux】linux下动态库so文件的一些认识

来源:http://mypyg.iteye.com/blog/845915 so其实就是shared object的意思。今天看了上面的博客,感觉好吃力。赶紧做个笔记记录一下。下面的内容大多都是连接中的,穿插我自己的笔记   牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。  1.so文件是什么? 2.怎么生成以及使用一个so动态库文件?...

weixin_34235457的博客 3082

Zemax实战:5步搞定牛顿望远镜光学设计(附球差优化技巧)

本文详细介绍了在Zemax OpticStudio中构建高精度牛顿望远镜光学系统的5步实战流程,包括初始参数设置、球差优化、折叠镜与遮光面配置等关键步骤。特别针对球差问题,提供了将主镜圆锥系数设为-1的优化方案,有效消除轴上弥散斑。通过3D视图和MTF分析验证,该系统可实现接近衍射极限的成像质量,适合天文观测等应用场景。

x8y9z0的博客 927

查看linux是否存在某个so,Linux/ARMLinux 中查看某个库是否存在的命令

Linux/ARMLinux 中查看某个库是否存在的命令.在我们做Linux开发的时候,往往会出现 某些库 can not found 的情况,在我们添加了这些库之后,如何查看这些库的路径是否被识别了呢?下面介绍一个命令:ldconfig -p | grep lts说明:使用 ldconfig -p 命令用来打印出当前缓存所保存的所有库的名字,然后用管道符传递给 grep lts 命令用于解析出 ...

weixin_39953740的博客 652

[数字电路]用与非门实现BCD译码器驱动数码管

Hello,大家好。这里是xdd_core,好久不见。今天来和大家聊聊大一数字电路课程的一个课设。# Key word:BCD Decoder,Proteus8.x,NAND Gate,Digital Circuit# 流程:Proteus8.x仿真电路并绘制PCB导出Gerber文件打样,最终实物验证。# 以下为我对这个课设的report(里面对整个设计做了详细介绍,并设计了完整的验证电路) 感谢观看,仅供参考,未经作者允许,禁止转载/抄袭,本文已上传至数据库,查重必挂QAQ BCD to 7-Segme

xddcore的博客 6012

基于CrossSim的存储硬件原型机ANN仿真:MNIST手写数字识别实现与分析

本项目基于CrossSim仿真平台,在存储硬件原型机上实现了MNIST手写数字识别的ANN模型。通过搭建CrossSim仿真环境,设计传统ANN基准模型和考虑硬件非理想特性的CrossSim模型,对比分析了不同配置下的识别性能。实验结果表明,在引入硬件噪声和器件变异的情况下,模型准确率仍能达到95%以上,验证了存储内计算架构的可行性。研究为存储硬件与计算单元融合提供了实验依据,展示了CrossSim在神经形态计算系统仿真中的实用价值。

huanghm88的专栏 596

查看.so函数

nm -D libxxx.so

sg656720274的博客 1255

CAN(2)-GD32

GD32中CAN的特征。

小柚子的博客 553

【Linux】在可执行程序中动态库和静态库的区别?静态链接、动态链接?各自有什么缺点?

什么是库文件? 库文件是事先编译好的方法的合集。比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,不需要重新编写。 库文件分两种:静态库和动态库(也叫共享库) Windows系统静态库扩展名为:.lib 动态库扩展名为.dll; Linux系统下静态库的扩展名为.a 动态库的扩展名为.so; 一、静态库(也称作归档文件): 简单来说就是一组“准备好使用”状态...

zDavid_2018的博客 4458

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux开发工具之gcc

一.gcc入门(上)  1.gcc相关概念  gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C、C++、Java、Pascal、Ada、COBOL语言等;支持多种硬件平台;  gcc不仅仅是本地编辑器,他还能跨平台交叉编译;  gcc有多重语言前端,用于解析不同的语言;  gcc是模块化设计的,可以加入新语言和新CPU架构的支持;  gcc是自由软件;  2.gcc编译程序

376

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

dll和so文件区别与构成

转自:http://blog.sina.com.cn/s/blog_4b9b714a0100ieam.html 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。在这些系统上,可执行文件包含一个叫做import directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要

Skypine_Lee的专栏 1285

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

linux 下 *.a 和*.so 的符号表

一、so简介 Linux系统中,动态链接库(shared object library)以.so结尾,是elf(Executable and Linkable Format)文件的一种,有两个符号表:“.symtab”和“.dynsym”。 .symtab: 包含大量的信息(包括全局符号global symbols) .dynsym: 只保留“.symtab”中的全局符号 故“.dynsym”可看作“.symtab”的子集。 PS:命令strip会去掉elf文件中“.symtab”,但不会去掉.

hhd1988的专栏 2440

Linux下gcc编译生成动态链接库*.so文件并调用它

https://blog.csdn.net/flyztek/article/details/73612469 动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。 1、动态库的编译 下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:s...

yingjie79613的博客 5361

linux 中的.so和.a文件

简单的在Linux下关于动态链接库和静态链接库的了解

imthefaker的博客 2273

linux动态链接库(***.so)

动态函数与静态函数的原型说明不同的是,动态函数应使用(*函数名)的形式,以便引用其指针。 #ifdef SHARED int(*gettime)(TIMETYPE *t); //动态函数说明; #else int gettime(TIMETYPE *t); //静态函数说明; #endif 路径:F:\Linux_书籍 1. LINUX下动态链接库的创建

suen1987的专栏 594

linux中.o,.a,.o,.so文件的意义和编程实现

    转自 烟雨楼 http://hi.baidu.com/yanyuloulinux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为静态库,是好多个.o合在一起,用于静态连接 .la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信

IT老兵 1万+

linux下动态库(*.so)的路径问题

  最近在使用wxWidgets,这是一个跨平台的C++库,在linux下编译成动态库(*.so),如果将编译后的可执行文件发布到其他机器的linux系统中,需要带上.so文件,这就需要设置一下这些动态库的路径,一般可以使用环境变量LD_LIBRARY_PATH来设置,可以在终端中直接输出如下的命令:export LD_LIBRARY_PATH=/library/wxwidgets其中/libra...

weixin_33699914的博客 272

libtool的工作原理

作者:刘军涛 系所:微处理器研发中心 日期:2006-1-6 1 libtool的工作原理 libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中;使用libtool的标准方法,可以在不同平台上创建并调用动态库。可以认为libtool是gcc的一个抽象,其包装了gcc(或者其他的编译器),用户无需知道细节,只要告诉libtool需要编译哪些库即可,libtool将处理

delovery的专栏 1831

linux直接运行so示例

#include const char banner[] = "linux直接运行so示例 run so demo \n Hello World\n"; extern int main (void) __attribute__ ((noreturn)); int main() { __write (STDOUT_FILENO, banner, sizeo

云守护的专栏 2180

Linux .a与.so的区别

在linux平台上编译时,常会遇到目标库的疑问,有静态库也有动态库,单个理解都不太难,但是对复杂的工程而言,一旦混合到一起去,对整个工程的理解和调用,将会造成很大困扰,本文就汇总这几种常见编译结果文件的区别。 一、格式说明 linux下编译,常会遇到后缀为:.o .so .a .la .ko等格式文件,尽管linux并不以扩展名作为识别文件格式的唯一依据,但规范约定还是有的,如下:

继续微笑lsj 5205

linux so编译地址,Linux下.so的编写,编译和运行

Linux下的.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件。1 下面是关于.so的介绍:一、引言通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数...

weixin_33100285的博客 527
上一篇: tinyxml2读写XML文件的例程
下一篇: CMake入门实战 补充说明
zhawk
博客等级 码龄23年 7粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值