linux用命令行編譯使用函數庫


同步於氣象家園日志
編譯靜態鏈接庫
 
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 選項
 
總結

 

========================================

linux下C/C++編程導入第三方庫文件的幾種方法

https://blog.csdn.net/kiss0tql/article/details/81253823

 

===============f90調用ECCODES=============

注意:安裝完成時候ECCODES_INCLUDE,$ECCODES_LIB這兩個環境變量, -I, -L后面不能有空格。此外指定庫名字為-leccodes_f90

 gfortran ServeEraGribDataTemperature.f90 -I$ECCODES_INCLUDE/ -L$ECCODES_LIB/ -leccodes_f90

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM