2011-09-17 125 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