linux gcc编译环境变量和动态库路径问题浅析以及LD_LIBRARY_PATH和LIBRARY_PATH区别

【gcc】 gcc编译动态库(共享库)、静态库|链接静态库、动态库 目录 即看即用 一、GCC 简介 GCC编译流程 GCC编译选项 二、GCC生成动态库和静态库 三、生成动态库和静态库实例 四、静态库和动态库的使用和配置 静态库的使用 共享库的使用 不到你指定链接的so错误 编译链接静态库、动态库 链接动态库 即看即用 多个源文件/目标生成动态库 a. gcc -fPIC -shared ... 阅读详情

1.头文件搜索顺序:

  • ①先搜索当前目录
    ②然后搜索-I指定的目录
    ③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
    ④最后搜索gcc的内定目录
    /usr/include
    /usr/local/include
    /usr/lib/gcc/x86_64-redhat-Linux/4.1.1/include

2.库文件搜索顺序:

  • 编译的时候:
    ①gcc会去找-L
    ②再找gcc的环境变量LIBRARY_PATH
    ③再找内定目录 /lib /usr/lib /usr/local/lib
    运行时动态库的搜索路径:
    动态库的搜索路径搜索的先后顺序是:
    ①编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,“指定。当指定多个动态库搜索路径时,路径之间用冒号”:“分隔)
    ②环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号”:"分隔)
    ③配置文件/etc/ld.so.conf中指定的动态库搜索路径;
    ④默认的动态库搜索路径/lib;
    ⑤默认的动态库搜索路径/usr/lib。
    (应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,类同#include <header_file>不搜索当前目录)
    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径。自己指定的路径就不说了,这里说明一下系统自动搜索的路径。

3. include路径添加:

  • 除了默认的/usr/include, /usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径:
C
  • export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
CPP
  • export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH 以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。

4. Link链接库文件路径:

  • 链接库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的(也可以在编译命令中通过 -l -L 来指定,这里讲的是使用系统默认搜索路径)。
    一般 Linux 系统把 /lib /usr/lib /usr/local/lib 作为默认的库搜索路径,所以使用这几个目录中的链接库文件可直接被搜索到(不需要专门指定链接库路径)。对于默认搜索路径之外的库,则需要将其所在路径添加到gcc/g++的搜索路径之中。
    链接库文件的搜索路径指定有两种方式:1)修改/etc/so.ld.conf 2)修改环境变量,在其中添加自己的路径
1) 修改环境变量
  • 动态链接库搜索路径:
    export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH

  • 静态链接库搜索路径:
    export LIBRARY_PATH=XXX:$LIBRARY_PATH

  • 以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。

2) 修改/etc/so.ld.conf
  • 在/etc/ld.so.conf 中添加指定的链接库搜索路径(需要root权限),然后运行 /sbin/ldconfig,以达到刷新 /etc/ld.so.cache的效果,这一步很重要。
  • LD_LIBRARY_PATH和LIBRARY_PATH区别,LD_LIBRARY_PATH用于运行时动态库的查询路径,而LIBRARY_PATH是用于编译时的查找路径。一个是运行时,一个是编译时。

原文

https://blog.youkuaiyun.com/andy205214/article/details/77091871

Windows下用MSYS2搭建C++开发环境:GCC/CMake配置实战 在Windows上进行C++跨平台开发时,开发者常面临MSVC与GCC编译器差异、CMake构建系统不兼容等问题。MSYS2作为一款在Windows上提供POSIX兼容层的工具链环境,通过pacman包管理器集成GCC、CMake、Ninja等核心组件,成为许多开发者构建跨平台C++工程的首选方案。它既保留了接近Linux原生的命令行体验,又生成原生Windows可执行文件,无需额外运行时依赖。相比WSL的跨文件系统IO延迟和Cygwin的重型模拟层,MSYS2在编译速度与易用性上取得平衡。本文详细梳理MS 阅读详情

相关推荐

aarch64-linux-gnu-gcc交叉编译工具链安装指南:从零到ARM64实战

在嵌入式开发与服务器端构建场景中,不同CPU架构之间的代码迁移始终是工程实践的核心挑战。x86_64主机无法直接运行ARM64二进制,这就需要借助交叉编译技术,在宿主机上生成目标机可执行的程序。交叉编译工具链作为连接不同架构的桥梁,其原理涉及编译器、目标三元组、sysroot及动态链接器等关键概念。理解工具链的命名规则与编译运行环境的差异,是掌握ARM64开发的第一步。在实际应用中,从环境准备、工具链安装、程序验证到错误排查,每个环节都会影响开发效率。对于需要构建高效、可复现的嵌入式构建流程的团队而言,掌握

weixin_34072637的博客 353

【c++】——LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

转载自:https://www.cnblogs.com/panfeng412/archive/2011/10/20/library_path-and-ld_library_path.html 1. LIBRARY_PATH和LD_LIBRARY_PATH的区别 LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目.

怡宝2号 1921

Linux下Qt完整安装指南:从依赖准备到xcb插件问题排查

Qt作为跨平台C++图形界面框架,在Linux环境中的部署涉及系统依赖、编译工具链和平台抽象层等多个环节。理解Qt的QPA(Qt Platform Abstraction)机制与动态库加载原理,是解决运行时问题的关键。通过配置PATH、LD_LIBRARY_PATH以及QT_QPA_PLATFORM_PLUGIN_PATH等环境变量,可确保qmake、moc工具和xcb平台插件被正确调用。这一过程在国产化操作系统适配、嵌入式开发及服务器无显示场景中尤为常见。本文以Ubuntu和麒麟系统为例,完整梳理Qt安装

weixin_28829629的博客 113

LINUX配置环境变量(LIBRARY_PATH)使gcc编译时能找到动态库

错误 /usr/bin/ld: cannot find -lcurl collect2: error: ld returned 1 exit status 操作 修改/etc/profile sudo vi /etc/profile 最后一行增加 export LIBRARY_PATH=$LIBRARY_PATH:XXXXX 立即生效文件 source /etc/profile LIBRARY_PATH含义 LIBRARY_PATH是程序编译期间查找动态链接库时指定查找动态库的路径 ...

wuspeng的博客 790

GCC:头文件和库文件的路径

用于指定运行时,库文件的路径(优先级要高于系统默认的查找路径):指定静态/动态库路径(编译时):用于指定编译时,库文件的路径。:用于指定C++的头文件路径。:用于指定C的头文件路径。

风静如云的博客 5703

OpenSSL 1.1.1t安装与排障:彻底解决version mismatch和动态库冲突

加密通信是现代网络安全的基石,而OpenSSL作为实现TLS/SSL协议的核心库,其版本管理直接影响业务系统的稳定性。很多运维人员在升级OpenSSL时,常因动态库链接路径混乱遭遇version mismatch错误,导致服务无法启动。理解动态链接器的搜索顺序、库文件命名规则及编译参数是避免这类问题的关键。OpenSSL 1.1.1t作为1.1.1分支的成熟稳定版本,广泛兼容老系统(如CentOS 7)且修复大量高危漏洞,是存量业务安全升级的务实之选。通过独立目录编译安装、合理配置ldconfig与PATH

weixin_34013044的博客 364

gcc/g++静态与动态链接库

文章目录库文件静态链接库动态链接库库的生成与使用静态库动态库参考文章 库文件 首先说明要对库有一个比较直观的理解。库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都依赖很多基础的底层库,不可能每个人的代码都从零开始,公共代码需要反复使用,就把这些代码编译成为“库”文件,因此库的存在意义非同寻常。 本质上说来库是一种可执行代码的二进制形式(注,其本身不可执行),可以被操作系统载入内存执行。 我们在链接的时候有两种库:动态链接库和静态链接库 静态链接库 在链接阶段,会将汇编生成的目标文件.o与引用到的

Charles Ren's Tech Blog 8764

WSL中使用VMD图形化界面

【代码】WSL中使用VMD图形化界面。

handsome213的博客 840

CentOS下GCC多版本共存:GCC Toolset与devtoolset完全指南

在服务器运维和C++项目开发中,GCC作为核心编译工具链,其版本往往左右着系统稳定性与项目兼容性。CentOS自带的系统编译器因追求稳健而版本偏旧,但新项目对C++17/20特性、CUDA工具链及ABI兼容性的硬性要求,催生了多版本GCC共存的真实需求。GCC Toolset(CentOS 7时代为devtoolset)通过软件集合机制,将新版本编译器安装在独立目录,借助PATH、LD_LIBRARY_PATH等环境变量实现“不覆盖、只增强”的安全切换,既能满足项目对编译器的版本诉求,又不破坏系统自有工具链

weixin_33895516的博客 372

YOLOv8模型INT8量化实战:解决sigmoid输出归零的坑(附代码修改)

本文详细介绍了YOLOv8模型INT8量化过程中遇到的sigmoid输出归零问题及其解决方案。通过修改模型导出代码、优化ONNX量化流程,并提供完整的部署优化技巧,帮助开发者在边缘计算设备上实现高效的模型推理。文章还包含量化效果验证和常见问题排查方法,助力开发者快速解决实际部署中的难题。

vvv99的博客 252

海康SDK回调PS流解析实战:从字节流到前端H264播放的完整流程

本文详细介绍了海康SDK回调PS流解析的完整流程,从字节流获取到前端H264播放的实现。涵盖SDK初始化、PS流数据结构解析、H264裸流提取、WebSocket传输及前端播放器集成等关键步骤,为视频监控系统开发提供实用指导。

weixin_29061531的博客 200

ps,gcc,gdb,静态库,动态库

本文摘要:文章介绍了Linux系统下的进程管理命令(ps、kill、jobs等)和终端交互操作,包括前后台进程控制。同时讲解了汇编语言特点、GCC编译流程(预处理、编译、汇编、链接)和可执行文件格式。重点说明了Makefile作用、GDB调试工具使用技巧,以及静态库(.a)和动态库(.so)的创建方法、使用区别(链接时机、磁盘占用、维护方式)。最后对比了静态库(编译时链接)和动态库(运行时链接)的核心差异,包括更新维护时的不同处理方式。

2402_84699040的博客 582

AI OS与LLM as OS:人工智能操作系统的崛起

近年来,随着大语言模型(Large Language Model, LLM)技术的突飞猛进,人工智能领域掀起了新的革命浪潮。以ChatGPT、GPT-4等为代表的LLM模型展现出了惊人的自然语言理解和生成能力,使得人机交互前所未有地拟人化、情境化。在此背景下,业界开始探索将LLM作为操作系统(Operating System, OS)的可能性,由此催生出"AI OS"和"LLM as OS"的概念。本文将深入解读这两个前沿概念,分析其内涵、技术原理、应用前景及面临的挑战。

AI天才研究院 993

Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的 .bashrc或.bash_profile里增加下面的内容: (注意:等号前面不要加空格,否则可能出现 command not found) #在PATH中找到可执行文件程序的路径。 export PATH =$PATH:$HOME/bin #gcc找到头文件的路径 C_INCLUDE_P

Blaider的专栏 1381

医疗工具识别(手术器械计数):基于YOLOv8的智能手术器械管理系统

YOLOv8是Ultralytics公司于2023年推出的最新一代目标检测算法,相比前代YOLOv5,在精度和速度上都有显著提升。Anchor-free检测:不再使用预定义的anchor boxes,简化了检测流程更高效的骨干网络:采用CSPDarknet53作为特征提取网络多尺度特征融合:通过PANet结构实现更好的小目标检测损失函数优化:使用CIoU损失提高边界框回归精度YOLOv8提供了多种规模的模型(n/s/m/l/x),可根据实际需求在精度和速度之间进行权衡。

YOLO 480

CAD二次开发c# .net加载cui\cuix菜单文件

public static void LoadMyCui(string cuiFile) { Document doc = Application.DocumentManager.MdiActiveDocument; object oldCmdEcho = Application.GetSystemVariable("CMDECHO"); object oldFileDia = Application.GetSys..

2127

Linux C/C++ 编译集锦 (GCC/build/compile/make)

Linux C/C++ 编译集锦 (GCC/build/compile/make/golang)

云满笔记 5542

基于工作流的低代码AI应用开发:Flock平台核心架构与实战指南

在AI应用开发领域,工作流编排正成为连接大语言模型(LLM)能力与复杂业务逻辑的关键技术。其核心原理是将任务分解为模块化节点,通过可视化方式定义执行顺序与数据流向,从而实现灵活可控的自动化流程。这种范式极大地提升了开发效率,降低了技术门槛,使得开发者能够聚焦于业务设计而非底层代码。在技术价值层面,工作流编排支持检索增强生成(RAG)、多智能体协作等高级模式,并能通过人工干预节点确保关键流程的可靠性与合规性。其典型应用场景包括智能客服、自动化办公、数据分析助手等。本文以Flock平台为例,深入解析了如何利用其

weixin_26848497的博客 381

Linux下和编译器、程序的运行、环境变量等相关的常见问题

(不断更新) 索引: (1) Linux下环境变量相关的问题 (2) Linux下GNU工具链相关的问题(GNU Toolchain)(gcc/g++/ld/make等等工具) (3) Linux下可执行文件的格式(主要是ELF格式,还有a.out/coff等)和可执行文件的加载 (4) 可执行程序执行加载动态库的搜索路径问题 Linux编译环境变量(LD_LIBRARY_PATH。。

。。。。 5529

高通Camx功能feature分析之二:remosaic流程

本文介绍了Remosaic技术及其在图像处理中的应用。Remosaic是将4cell1像素排布还原为普通Bayer结构的过程,分为硬件和软件两种实现方式。文章详细解析了Remosaic流程,包括配流情况、Feature选择、初始化过程,以及触发拍照的完整流程。重点分析了从普通预览切换到全尺寸拍照的关键步骤:激活全尺寸RDI会话、生成请求、等待就绪、唤醒离线线程和重启预览。通过代码层面的分析,揭示了Remosaic技术如何实现高分辨率图像还原,同时说明了该过程中可能出现的预览定屏现象及其原因。

1880

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Ubuntu 20.04 源码编译升级 GCC 12.2 完整指南:从依赖到多版本共存

在 Linux 开发环境中,系统自带的 GCC 版本往往受发行版策略限制而无法升级,例如 Ubuntu 20.04 自带 GCC 9.4,对 C++20 特性支持不足,导致许多新项目无法编译。理解编译工具链的工作原理,掌握源码编译方法,成为解决此类问题的关键技能。源码编译本质上是利用现有编译器逐级构建新编译器的自举过程,涉及 GMP、MPFR、MPC 等数学库依赖配置,以及 configure 参数、编译线程数、动态库路径等细节管控。通过合理规划安装目录并使用 update-alternatives 工具,

weixin_34348805的博客 236

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux链接机制与排错:符号解析、重定位和动态库搜索

在 Linux/C/C++ 开发中,从源码到可执行文件并非一次编译完成,链接承担了符号解析、重定位与库合并。理解静态链接与动态链接、ELF 目标文件、GOT/PLT 和动态链接器搜索路径,能解释 undefined reference、cannot open shared object file、GLIBC 版本不匹配等常见故障。它直接影响二进制部署、跨环境运行、插件加载和容器镜像体积。围绕这些基础机制,可建立从 readelf/ldd/nm 到 LD_DEBUG 的排查链路,把链接错误定位到符号、重定位或

weixin_34128839的博客 385

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

静态库与动态库:原理、区别与应用场景解析

在软件开发中,库(Library)作为可重用代码集合,是提升开发效率的核心组件。静态库与动态库作为两种主要形式,其根本区别在于链接时机和内存管理机制。静态库在编译时被完整嵌入可执行文件,适合部署环境固定的场景;动态库则通过运行时加载实现多进程共享,便于热更新和性能优化。理解mmap内存映射机制和动态链接器工作原理,能有效解决库版本冲突、符号未定义等常见问题。现代开发中,结合LD_LIBRARY_PATH环境变量和dlopen API,可实现灵活的插件架构。在容器化和微服务趋势下,合理选择库的链接方式对系统性

weixin_30883311的博客 397

麒麟V10源码编译升级GCC 9.3.0完整指南:依赖、参数与踩坑记录

GCC(GNU编译器套件)是Linux系统软件构建的基石,其版本高低直接影响对C++17等现代语言标准的支持能力。在国产化服务器(如麒麟V10)上,系统默认GCC往往版本偏旧,导致新项目编译失败。通过源码编译升级GCC,本质上是用GMP、MPFR、MPC等基础数学库构建一套独立的工具链。将新版本安装到独立目录(如/opt)并配置PATH与LD_LIBRARY_PATH,既能满足项目对现代C++标准的需求,又避免替换系统GCC带来的连锁风险。该方案适用于x86_64及飞腾、鲲鹏等ARM64架构,可解决动态库版

weixin_30745553的博客 330

深入解析链接器报错:ld.lld找不到库文件的原理与解决方案

在C/C++、Rust等系统级编程中,链接器是构建过程中的关键组件,负责将多个目标文件与库文件合并生成最终可执行程序。其核心原理在于符号解析与重定位,通过搜索预定义路径来定位静态库(.a/.lib)或动态库(.so/.dll)。理解链接器工作流程对解决构建错误至关重要,尤其在跨平台开发和复杂依赖管理中。当链接器报出“unable to find library”错误时,通常意味着库搜索路径配置不当或库文件缺失。这一问题的技术价值在于保障项目构建的可靠性,避免因依赖问题导致编译中断或运行时异常。常见应用场景包

weixin_34166847的博客 364

GLIBCXX_3.4.32 not found 解决方案:C++ 运行库版本兼容实战指南

在 Linux 系统中,动态链接库通过符号版本标签管理 ABI 兼容性,其中 GLIBCXX 是 C++ 标准库 libstdc++ 的版本标识。当程序编译时引用了较新的符号版本,而运行环境的 libstdc++ 较旧时,就会触发类似 version 'GLIBCXX_3.4.32' not found 的加载错误。这种现象常见于将新环境编译的二进制部署到旧服务器、conda 环境混用系统库或 pip 安装含 C++ 扩展的包等场景。理解符号版本机制是排查问题的关键:它代表库中符号的迭代标记,而非文件缺失。

weixin_34110749的博客 349
上一篇: git使用教程
下一篇: Ubuntu 16.04 编译安装opencv 3.4.6过程和 anaconda3/lib/libtiff.so.5: undefined reference to `ZSTD_freeCStre
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值