linux不指定LD_LIBRARY_PATH运行程序

9 篇文章 0 订阅

在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编译选项用于指定动态库的寻找路径,如果存在多个路径,用":"分割。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值