同步於氣象家園日志
編譯靜態鏈接庫
gfortran -c sub.f90 func.f90
產生了func.mod文件。注:mod文件是靜態庫的接口。如果刪掉了func.mod,編譯時候會失敗
打包創建一個靜態鏈接庫 my.lib
ar rv my.lib func.o sub.o
使用靜態鏈接庫
編譯
gfortran -c main.f90 產生main.o
鏈接
gfortran main.o my.lib -o exe
注:刪掉靜態鏈接庫my.lib之后仍然可以執行可執行程序
------------------------------------------------------------------------------------------------
編譯動態鏈接庫
gfortran sub.f90 func.f90 -shared -fPIC -o libfcode.so
使用動態鏈接庫
編譯主程序
gfortran main.f90 libfcode.so -o.exe
運行(失敗嘗試)
./exe 失敗!
找不到動態鏈接庫
解決辦法: 設置LD_LIBRARY_PATH,告訴linux系統 運行時候動態鏈接庫的搜索路徑
export LD_LIBRARY_PATH= ./
隨后再運行
注:ldd命令可以查看可執行文件所依賴的動態鏈接庫。
======================================================
使用第三方函數庫
告訴編譯器 include (mod文件)、lib(鏈接時候用到)、DLL Runtime Library 運行時庫、路徑和文件名
lapack安裝(編輯make.inc => 編輯Makefile => make 生成liblapack.a,librefblas.a)
Lapack 使用
演示使用
gfortan test_lapack.f90 -o x
錯誤:沒有定義的'sgesv" undefined reference to ''
需要把函數庫帶進來,有三種方法:
1 直接把函數庫帶進來 (每次都需要輸入函數庫的名字和路徑,比較粗暴的鏈接方式)
gfortran test_lapack.f90 -o x lapack-3.6.1/liblapack.a lapack3.6.1/librefblas.a
2 將這兩個函數庫拷到系統lib目錄里面去
sudo cp lapack-3.6.1/lib*.a /usr/lib
以后編譯時候帶上庫名稱就可以
gfortran test_lapack.f90 -llapack -lrefblas
3 如果沒有系統管理員權限,或者不想拷到系統目錄下去,有另一種方法。
加-L選項,將函數庫所在路徑告訴編譯器 gfortran test_lapack.f90 -L lapack-3.6.1/ -llapack -lrefblas
如果有include,可能還需要加-I 選項
總結
gfortran ServeEraGribDataTemperature.f90 -I$ECCODES_INCLUDE/ -L$ECCODES_LIB/ -leccodes_f90