For most Linux binaries, NCL was built using gcc and gfortran. This may cause a dependency on a file called "libgfortran.so.x".
If you have a different version of gfortran installed on your system than what NCL was built with, then you may get an error message that "libgfortran.so.x can't be found".
If you see this, then you can try one of these things:
Try to find the libgfortran.so.x file that it is complaining about. You can try the "locate" command. For example if the file is "libgfortran.so.1":
locate libgfortran.so.1
If found, add this path to your LD_LIBRARY_PATH environment variable.
For example, if "libgfortran.so.1" is the file you need, and it is in /usr/local/lib, then look at the instructions below, depending on what shell you are running, and depending on whether LD_LIBRARY_PATH is already set:
env | grep LD_LIBRARY_PATH
From csh or tcsh, if not set:
setenv LD_LIBRARY_PATH /usr/local/lib
From csh or tcsh, if already set:
setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:
/usr/local/lib
From bash or ksh, if not set:
export LD_LIBRARY_PATH=/usr/local/lib
From bash or ksh, if already set:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
From sh, if not set:
LD_LIBRARY_PATH=/usr/local/lib
export LD_LIBRARY_PATH
From sh, if already set:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
Install the "compat-libgfortran" runtime library. See one of these sites for starters:
http://rpmfind.net/linux/rpm2htm ... mpat-libgfortran-41
https://admin.fedoraproject.org/ ... 7a1a58108960859779f
Install the version of gfortran that your version of NCL was built with. (It is possible to have multiple versions of gfortran installed on the same system without conflict.)
It may then be necessary to set the LD_LIBRARY_PATH environment variable to the path of the "libgfortran.so.x" file.
If all else fails, then send email to ncl-install@ucar.edu. You need to be a member in order to post
PATH和LD_LIBRARY_PATH本質都是變量,所謂變量的意思就是由別人賦值產生的,直覺往往會讓我們添加和減少這個變量本身的某些路徑,實際上這是不正確的。正確的做法是我們要去修改賦予這個變量數值的那些配置文件,加一條路徑或者減一條。說到底變量只關乎顯示,不關乎其用於顯示的內容。
PATH: 可執行程序的查找路徑
查看當前環境變量:
echo $PATH
設置:
方法一: export PATH=PATH:/XXX 但是登出后就失效
方法二:修改~/.bashrc或~/.bash_profile或系統級別的/etc/profile
1. 在其中添加例如export PATH=/opt/ActivePython-2.7/bin:$PATH
2. source .bashrc (Source命令也稱為“點命令”,也就是一個點符號(.)。source命令通常用於重新執行剛修改的初始化文件,使之立即生效,而不必注銷並重新登錄)
LD_LIBRARY_PATH: 動態庫的查找路徑
設置:
方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效
方法二: 修改~/.bashrc或~/.bash_profile或系統級別的/etc/profile
1. 在其中添加例如export PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH
2. source .bashrc (Source命令也稱為“點命令”,也就是一個點符號(.)。source命令通常用於重新執行剛修改的初始化文件,使之立即生效,而不必注銷並重新登錄)
方法三:這個沒有修改LD_LIBRARY_PATH但是效果是一樣的實現動態庫的查找,
1. /etc/ld.so.conf下面加一行/usr/local/mysql/lib
2. 保存過后ldconfig一下(ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.)
方法三設置稍微麻煩,好處是比較不受用戶的限制。
今天用set設置PATH變量(加一個路徑),發現雖然echo的時候顯示修改成功了,實際執行命令的時候確沒有去那個路徑查找;當前shell是c shell(csh).
使用set和setenv命令可以設置shell選項或者列出shell變量,其中setenv 是csh的命令,在bash中用export命令,alias作用相當windows下的快捷方式。
2.語法格式
set 變量名 = 內容
set 變量名 =(內容1 內容2 )
set 變量名 ="內容1 內容2"
setenv 變量名 內容
setenv 變量名 "內容1 內容2"
setenv 變量名 '內容1 內容2'
alias 簡化名稱 原文件名
alias 簡化名稱 "原文件名 參數"
setenv中的env就是環境environment的簡寫,這個命令是用來設置環境變量的,譬如說設置文件路徑、本地顯示啊什么的,舉個例,如果想調用服務器的軟件在本地顯示,用這個命令:setenv DISPLAY 1xx.1xx.1xx.1xx:0 。在bash中export命令和csh中的setenv命令類似。
4。環境變量和內部變量:后者不能被子進程繼承(如同C里的局部變量)--改環境變量就會自動改內部變量,反之不然。“set”可給出內部變量列表,“env”可給出環境變量列表。繼承只對環境變量有效
sh: PATH=/usr/bin:$PATH ; export PATH--注意:在export前為內部變量,之后為環境變量。
Csh: set setenv PATH /usr/bin:$PATH--注意: 在csh中環境變量的賦值(setenv)沒有等號, 而內部變量的賦值(set)有等號。
Linux 運行的時候,是如何管理共享庫(*.so)的?在 Linux 下面,共享庫的尋找和加載是由 /lib/ld.so 實現的。 ld.so 在標准路經(/lib, /usr/lib) 中尋找應用程序用到的共享庫。
但是,如果需要用到的共享庫在非標准路經,ld.so 怎么找到它呢?
目前,Linux 通用的做法是將非標准路經加入 /etc/ld.so.conf,然后運行 ldconfig 生成 /etc/ld.so.cache。 ld.so 加載共享庫的時候,會從 ld.so.cache 查找。
傳統上,Linux 的先輩 Unix 還有一個環境變量:LD_LIBRARY_PATH 來處理非標准路經的共享庫。ld.so 加載共享庫的時候,也會查找這個變量所設置的路經。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib
export LD_LIBRARY_PATH
但是,有不少聲音主張要避免使用 LD_LIBRARY_PATH 變量,尤其是作為全局變量。這些聲音是:
* LD_LIBRARY_PATH is not the answer - http://prefetch.net/articles/linkers.badldlibrary.html
* Why LD_LIBRARY_PATH is bad - http://xahlee.org/UnixResource_dir/_/ldpath.html
* LD_LIBRARY_PATH - just say no - http://blogs.sun.com/rie/date/20040710
解決這一問題的另一方法是在編譯的時候通過 -R<path> 選項指定 run-time path。
1. 往/lib和/usr/lib里面加東西,是不用修改/etc/ld.so.conf的,但是完了之后要調一下ldconfig,不然這個library 會找不到
2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然后再調用ldconfig,不然也會找不到。
比如安裝了一個mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下 面,這時就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存過后ldconfig一下,新的 library才能在程序運行時被找到。
3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有權限加東西)。那也可以,就是export一個全局變 量LD_LIBRARY_PATH,然后運行程序的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有權限或臨時需要的時 候使用。
4. ldconfig做的這些東西都與運行程序時有關,跟編譯時一點關系都沒有。編譯的時候還是該加-L就得加,不要混淆了。
5. 總之,就是不管做了什么關於library的變動后,最好都ldconfig一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。
LD_LIBRARY_PATH 這個環境變量是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共享庫。可以設置多個搜索目錄,這些目錄之間用冒號分隔開。在linux下,還 提供了另外一種方式來完成同樣的功能,你可以把這些目錄加到/etc/ld.so.conf中,然后調用ldconfig。當然,這是系統范圍內全局有效 的,而環境變量只對當前shell有效。按照慣例,除非你用上述方式指明,loader是不會在當前目錄下去找共享庫的,正如shell不會在當前目前找 可執行文件一樣。
================================================================================================
在shell下嘗試設置LD_LIBRARY_PATH,以下面這種形式設置,老是報錯bash: LD_LIBRARY_PATH: command not found,
LD_LIBRARY_PATH=/usr/local/lib
LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/usr/local/lib
可能是因為系統之前沒有設置過LD_LIBRARY_PATH,於是改成這樣:
export LD_LIBRARY_PATH=/usr/local/lib
然后用 echo $LD_LIBRARY_PATH檢查一下是否真的設置成功,發現可以。
接着在該shell下運行eclipse生成的可執行文件,沒有錯誤。
另外,如果不想每次新啟一個shell都設置LD_LIBRARY_PATH,可以編輯~/.bash_profile文件:
$ vi ~/.bash_profile
添加:
LD_LIBRARY_PATH=/usr/local/lib
export LD_LIBRARY_PATH
這兩行,完成之后.bash_profile如下所示:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
LD_LIBRARY_PATH=/usr/local/lib
export PATH
export LD_LIBRARY_PATH
但是這種方法只能用在shell下,想在eclipse里面運行,還是不行:
嘗試了eclipse項目properties里面的各種設置都不起作用。
用“eclipse LD_LIBRARY_PATH”作為關鍵字(可見關鍵字多么重要)才搜到這么篇文章 《eclipse+cdt+gcc編譯選項控制》 http://hi.baidu.com/zsffei/blog/item/7b17c043ceb51e1772f05de1.html
才知道應該在eclipse的項目屬性-->C/C++ Build-->Settings-->Tool settings-->GCC C++ Linker-->Miscellaneous的Other options (-Xlinker [option])添加 -R/usr/local/lib
運行,一切正常,折騰了一下午,太感動了。