Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 加载共享库时出错_Bash_Shared Libraries - Fatal编程技术网

Bash 加载共享库时出错

Bash 加载共享库时出错,bash,shared-libraries,Bash,Shared Libraries,谢谢你们回答我之前的问题。正如您所建议的,问题的原因是没有链接库。现在我已经用以下代码生成了可执行文件:(我的g++和gcc的版本是4.4.5。我使用的是Ubuntu 10.10。) 但是,当我运行可执行文件时,会出现另一个问题 ./ex_addinst 出现错误:(我不确定是否应该开始一个新问题,或者当前没有…) 但是liblindo64.so.6.0存在于lib~/lindoapi/bin/linux64的文件夹中,该文件夹包含以下文件: libconsub3.so libirc.so

谢谢你们回答我之前的问题。正如您所建议的,问题的原因是没有链接库。现在我已经用以下代码生成了可执行文件:(我的g++和gcc的版本是4.4.5。我使用的是Ubuntu 10.10。)

但是,当我运行可执行文件时,会出现另一个问题

./ex_addinst
出现错误:(我不确定是否应该开始一个新问题,或者当前没有…)

但是liblindo64.so.6.0存在于lib~/lindoapi/bin/linux64的文件夹中,该文件夹包含以下文件:

libconsub3.so  libirc.so          liblindojni.so        libmosek64.so.5.0  lindo.par
libguide.so    liblindo64.so      liblindojni.so.6.0.3  libsvml.so         placeholder
libimf.so      liblindo64.so.6.0  libmosek64.so         lindoapivars.sh    runlindo
我在liblindo.so.6.0和liblindo.so之间创建了一个符号链接:

ln -sf liblindo64.so.6.0 liblindo64.so
“-llindo64”是g++命令,因此我认为应该链接liblindo64.so.6.0。 我试着把-L改成-Llib,但没用


谁能告诉我这里怎么了?谢谢

您需要在运行时链接器的搜索路径中找到
文件所在的目录

您可以通过如下方式更改
LD\u LIBRARY\u PATH
环境变量来完成此操作:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HOME/lindoapi/bin/linux64

启动可执行文件之前。

如果您不打算将当前位于
/home/li/work/tools/lindo/lindoapi/bin/linux64
下的库安装到系统目录(
/usr/lib
/usr/local/lib
等)中,那么最好简单地链接应用程序,使其正常工作(TM):

这比始终必须设置
LD\u LIBRARY\u PATH
更可取,因为

  • 其他人可以运行您的可执行文件(无需设置
    LD_LIBRARY_PATH
    )和
  • 它不会减慢所有其他应用程序的速度(否则它们都会搜索
    LD\u LIBRARY\u PATH
    以查找
    libc.so.6
    ,等等)
您的
LD\u LIBRARY\u PATH
设置不起作用的原因(对Mat的答案的评论)是您在
/HOME
的预期位置使用了
/HOME

总结解决方案:

  • 我使用以下命令将路径添加到~./bashrc:

    导出LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HOME/../lindoapi/bin/linux64

  • (生成.o文件后)将目标文件链接到:

    g++-o ex_addinst./ex_addinst.o-L/home/../lindoapi/bin/linux64-m64-llindo64-lmosek64-lconsub3-lc-ldl-lm-lguide-lpthread-lsvml-limf-lirc


  • 感谢Mat,在directional HOME/../lindoapi/bin/linux64中,有一个lindoapivars.sh文件,其中LD_LIBRARY_路径被修改为:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:HOME/li/work/tools/lindo/lindoapi/bin/linux64导出LD_LIBRARY_路径。但是问题还是出现了..那个字符串是
    HOME
    还是
    $HOME
    ?对不起,是$HOME,我的打字错误。由于lindoapivars.sh中有内容,我认为这不是更改此变量的正确位置。感谢朋友,根据您的建议,我将库添加到了~/.bashrc:export LD_library_PATH=$LD_library_PATH:$HOME/li/work/tools/lindo/lindoapi/bin/linux64中,但问题仍然是一样的。我更改~/.bashrc正确吗?我想我是在起诉未登录的shell,所以我想只有~/.bashrc被读取。它现在可以工作了…太奇怪了…我很高兴,谢谢你的帮助@垫子
    ln -sf liblindo64.so.6.0 liblindo64.so
    
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HOME/lindoapi/bin/linux64
    
    gcc -o ex_addinst  ./ex_addinst.o \
      -L/home/li/work/tools/lindo/lindoapi/bin/linux64 \
      -Wl,-rpath=/home/li/work/tools/lindo/lindoapi/bin/linux64 \
      -m64 -llindo64  -lmosek64 -lconsub3 -lc -ldl \
      -lm -lguide -lpthread -lsvml -limf -lirc