加载共享库时出错

时间:2011-09-17 14:50:48

标签: bash shared-libraries

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

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

但是,当我使用

运行可执行文件时,会出现另一个问题
./ex_addinst
出现

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

./ex_addinst: error while loading shared libraries: liblindo64.so.6.0: cannot open shared object file: No such file or directory

但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,但没有帮助。

谁能告诉我这里有什么问题?谢谢!

3 个答案:

答案 0 :(得分:2)

您需要在运行时链接程序的搜索路径中包含.so文件所在的目录。

您可以通过更改LD_LIBRARY_PATH环境变量来完成此操作:

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

在启动可执行文件之前。

答案 1 :(得分:1)

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

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

这总是必须设置LD_LIBRARY_PATH,因为

  • 其他人可以运行您的可执行文件(无需设置 LD_LIBRARY_PATH)和
  • 它不会减慢所有其他应用程序的速度(否则它们将LD_LIBRARY_PATH搜索libc.so.6等等。)

LD_LIBRARY_PATH设置不起作用的原因(对Mat的回答是评论)是您使用了HOME的{​​{1}}。

答案 2 :(得分:1)

总结解决方案:

  1. 我将路径添加到〜。/ bashrc:

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

  2. (生成.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