linux不指定LD_LIBRARY_PATH运行程序

2023-05-16

在windows中,只要将动态库DLL跟可执行程序放在同一个目录,程序在运行时,就能找到DLL。然而,在linux中,必须指定动态库的路径,程序才能找到动态库,即使可执行程序和动态库在同一个目录。举个例子,编写一个计算库,支持加减乘除,代码如下:

calc.h

//
//calc.h
//
#ifndef __CALC__
#define __CALC__

#if defined(__cplusplus)
extern "C" {
#endif

int add(int x, int y);
int subtract(int x, int y);
int multiply(int x, int y);
int devide(int x, int y);

#if defined(__cplusplus)
}
#endif

#endif

calc.c

//
//calc.c
//
#include "calc.h"
#include <assert.h>

int add(int x, int y)
{
        return x + y;
}

int subtract(int x, int y)
{
        return x - y;
}

int multiply(int x, int y)
{
        return x * y;
}

int devide(int x, int y)
{
        assert(y != 0);

        return x / y;
}

编译生成动态库

gcc -shared -fPIC -o libcalc.so calc.c

测试程序源码mycalc.c

//
//mycalc.c

#include "calc.h"
#include <stdio.h>

int main(int argc, char **argv)
{
        int x, y;
        x = 10;
        y = 5;
        printf("%d + %d = %d\n", x, y, add(x, y));
        printf("%d - %d = %d\n", x, y, subtract(x, y));
        printf("%d * %d = %d\n", x, y, multiply(x, y));
        printf("%d / %d = %d\n", x, y, devide(x, y));

        return 0;
}

编译生成可执行程序mycalc。

gcc -o mycalc  mycalc.c -L. -lcalc

动态库libcalc.so和可执行程序mycalc均在同一个目录下,执行./mycalc,却产生下面的错误:

./mycalc: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory

主要原因是在加载动态库时没有找到libcalc.so。

通过export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH导出动态库位置,问题解决。但当我打开一个新的终端执行./mycalc时,同样的问题又产生了。很显然,LD_LIBRARY_PATH仅对当前终端生效。这样,程序在部署的时候非常不方便。为了解决动态库路径问题,在编译程序时可以使用-Wl,-rpath=.来解决,新的可执行程序编译命令如下:

gcc -o mycalc  mycalc.c -Wl,-rpath=. -L. -lcalc

再打开新的终端,执行./mycalc,程序执行成功。-Wl,-rpath编译选项用于指定动态库的寻找路径,如果存在多个路径,用":"分割。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux不指定LD_LIBRARY_PATH运行程序 的相关文章

  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 如何在 Jenkins 声明式管道中设置 PATH

    在 Jenkins 脚本化管道中 您可以像这样设置 PATH 环境变量 node git url https github com jglick simple maven project with tests git withEnv PAT
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • Android 中的 java.io.FileNotFoundException

    我正在使用代码从图库中选择图像 public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView R layout
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im

随机推荐

  • vxworks 开发环境搭建

    安装指南 1 安装VxWorks6 9 xff08 光盘文件是DVD R147826 1 1 01 vx69 udf iso xff09 1 不要选择两个check 选项 xff0c 可以节省不必要的时间 xff1b 2 Next 到如图
  • ffmpeg调用avformat_open_input打开rtmp转发流阻塞

    G28181协议接入时 xff0c 为了减少视频处理服务的改动 xff0c 故采用了rtmp转发的方案 使用nginx搭建rtmp转发服务器 xff0c 设备代理将流推送给nginx xff0c nginx再将流转发给视频处理服务 但设备代
  • 交叉编译一个能在mips下运行的vim编译器

    有了交叉编译环境 xff0c 下一步就能在我的路由器和光猫上搞更多的事情了 我的目标是编译出能够在路由器上运行的二进制程序 1 对交叉编译的理解 什么是交叉编译 xff1f 我们常用的路由器 光猫 电视盒等等都运行着一个系统 xff0c 它
  • CAP 定理的含义

    CAP 定理的含义 作者 xff1a 阮一峰 日期 xff1a 2018年7月16日 分布式系统 xff08 distributed system xff09 正变得越来越重要 xff0c 大型网站几乎都是分布式的 分布式系统的最大难点 x
  • boost::any实现解析

    忘记当初具体想做什么了 xff0c 只记得要求 xff1a 将各种类型 xff08 如int xff0c char xff0c float xff0c 自定义类型等 xff09 放到一个容器里 这样的要求 xff0c 目前stl的任何容器都
  • 程序性能优化工具——gprof

    gprof是程序性能分析的一个重要工具 xff0c 通过gprof工具可以获取程序中函数之间的调用关系 xff0c 每个函数的调用次数 xff0c 及函数的消耗时间 xff0c 从而为程序性能优化指明方向 由此也可以推断出 xff0c 一个
  • 程序性能优化之分支预测

    程序是由多条指令构成的 xff0c 程序的运行便是cpu一条一条执行程序指令的过程 一条指令的执行过程大致可以分为加载指令 xff0c 翻译指令 xff0c 加载数据 xff0c 执行运算 xff0c 更新数据几个阶段 xff0c 每个阶段
  • 初识valgrind

    valgrind是一款非常优秀的性能调试工具 xff0c 通过valgrind xff0c 可以完成以下几点工作 xff1a 1 Memcheck xff1a 内存错误检测 2 Cachegrind xff1a 缓存和分支预测分析 3 Ca
  • 服务运维-日志

    服务一般情况下运行在后台 xff0c 没有界面 xff0c 很难观察到服务的状态 因此 xff0c 对于服务运维 xff0c 日志变成了一个非常重要的工具 通过服务日志 xff0c 可以了解到服务的运行状态 xff0c 如服务是否正常运行
  • 如何查看cpu是否支持sse指令级

    Mac xff1a 命令 xff1a sysctl a grep machdep cpu features 结果 xff1a machdep cpu features FPU VME DE PSE TSC MSR PAE MCE CX8 A
  • Mac系统下VSCode配置gopath

    golang项目的编译和调试依赖gopath 命令行可以通过export为每个golang项目导出不同的gopath xff0c 使用VSCode也可以通过配置 xff0c 实现不同的golang项目使用不同gopath xff0c 步骤如
  • GDB打印vector指定元素

    使用GDB调试程序时 xff0c 需要查看变量的值 对于普通变量 xff0c 直接使用p命令即可 xff0c 如下 xff1a 对于vector xff0c 也可以使用相同的方法 xff0c 如下 xff1a vector元素较少时 xff
  • Linux中学教程(一)

    突然想写点关于linux的东西 xff0c 一是将自己几十年来零碎的知识作以串联 xff0c 二是能为正在学习路上的新手作些指引 而恰好作者的孩子是一位初一的学生 xff0c 我写的这些东西也正是我手把手教授他的 xff0c 现在分享出来并
  • libevent之eventop

    功能 xff1a IO处理模型 架构 xff1a 实现 xff1a event internal h定义eventop结构体 xff0c 在 c文件实例化生成对应的全局对象 xff0c 如在poll c中生成pollops对象 event
  • C++ Lambda表达式的使用方法

    C 43 43 Lambda表达式的简单实用方法如下 xff1a include lt functional gt include lt algorithm gt include lt iostream gt include lt list
  • Visual Code 配置golang开发环境

    1 去微软官网下载安装Visual Code http code visualstudio com Download 安装成功后 xff0c 打开命令行 xff0c 输入go version xff0c 会输出golang 版本 如果没有输
  • linux下调用mysql_query产生SIGSEGV段错误

    xfeff xfeff 程序需要用到MySQL来进行持久化 xff0c 代码在windows测试通过 xff0c 但在Linux调试时 xff0c 产生下面的异常 xff1a Thread 9 34 NodesManagerd 34 rec
  • vim编辑文档误用Ctrl+S导致vim假死

    xfeff xfeff 在linux使用vim编辑源码之后 xff0c 顺手使用了ctrl 43 s xff0c 本以为会保存源码 xff0c 但不料vim却卡住了 xff0c 怎么动都动不了 经过查询 xff0c 才发现ctrl 43 s
  • golang获取命令行参数

    xfeff xfeff 对于C C 43 43 java xff0c 或C 程序 xff0c 我们可以通过入口函数 xff08 main函数 xff09 直接获取命令行参数 xff1a int main int argc char argv
  • linux不指定LD_LIBRARY_PATH运行程序

    在windows中 xff0c 只要将动态库DLL跟可执行程序放在同一个目录 xff0c 程序在运行时 xff0c 就能找到DLL 然而 xff0c 在linux中 xff0c 必须指定动态库的路径 xff0c 程序才能找到动态库 xff0