红联Linux门户
Linux帮助

linux不指定LD_LIBRARY_PATH运行程序

发布时间:2017-03-14 14:45:27来源:linux网站作者:王健
在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编译选项用于指定动态库的寻找路径,如果存在多个路径,用":"分割。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/29171.html