2011-09-17 129 views
3

谢谢你们回答我以前的问题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 /斌/ LINUX64的ER其中包含以下文件:

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

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

回答

1

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

你可以通过改变LD_LIBRARY_PATH环境变量是这样的:开始你的可执行文件之前

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

+0

Thanks Mat,在home /.../ lindoapi/bin/linux64中,有一个lindoapivars.sh文件,其中LD_LIBRARY_PATH已被修改如:LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:HOME/li/work/tools/lindo/lindoapi/bin/linux64 012-export LD_LIBRARY_PATH。但他的问题仍然出现.. – ulyssis2

+0

它是'HOME“或'$ HOME'在该字符串中? – Mat

+0

这是$ HOME,对不起,我的错字。由于lindoapivars.sh中有内容,我认为这不是改变这个变量的正确位置。 – ulyssis2

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_PATHlibc.so.6等)

LD_LIBRARY_PATH设置没有工作(垫上的答案评论)的原因是你使用HOME其中/home是打算。

+0

感谢朋友,在您的建议下,我将库添加到〜/ .bashrc中:export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:$ HOME/li/work/tools/lindo/lindoapi/bin/linux64,但问题仍然如此。我正确地更改〜/ .bashrc吗?我想我起诉非登录外壳,所以我认为只有〜/ .bashrc被读取。 – ulyssis2

+0

它现在可以工作...所以奇怪...我很高兴,感谢您的帮助! @垫 – ulyssis2

1

总结了解决方案:

  1. 我添加路径〜。/ bashrc中与:

    出口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