linux不指定LD

    xiaoxiao2021-03-25  77

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

    
    转载请注明原文地址: https://ju.6miu.com/read-14886.html

    最新回复(0)