win64 qt與fortran (codeblocks) 混合編程
本教程主要解說用fortran生成dll供qt調用(win64)
本教程須要的軟件及文件可從以下的連接下載:
http://pan.baidu.com/s/1c04jziC
fortran我用的軟件是codeblocks。這是一款包括基於gfortran的開源軟件。
1、先來說說codebolcks的環境配置:
先下載codeblocks(下面簡稱cb),這個沒啥好說的,下載就是了。
1.1、codebolcks的漢化:
將下載的.mo文件放在:CodeBlocks\share\CodeBlocks\locale\zh_CN 下
打開cb:設置->環境設置->視圖->勾選Internationalization->Chinese
重新啟動cb即可了
1.2、編譯器設置(僅對64位系統):
假設你的系統是64位的要生成64位的dll。
首先下載TDM-GCC-64壓縮包,解壓。我的解壓在F盤。
設置->編譯器->Toolchain executables->
編譯器安裝文件夾改為F:\TDM-GCC-64
C編譯器、C++編譯器、動態鏈接器、靜態鏈接器、資源編譯器
都改為F:\TDM-GCC-64\bin下的。
例如以下圖:
2、用codebolcks生成dll:
文件->新建->project->Fortran->Fortran DLL,取個名字我取的dll
這時應該會自己主動生成一個main.f95文件,直接點黃色齒輪編譯即可了。
這時再找到你建project的目錄,在\bin\Debug目錄下應該有這三個文件,我們僅僅須要當中的dll文件
3、用qt動態鏈接codeblocks生成的dll:
打開qt,新建一個project,運行qmake,將自己主動生成一個目錄,我的是build-untitled-Desktop_Qt_5_4_2_MSVC2013_OpenGL_64bit-Debug
將之前生成的dll.dll拷貝到build-untitled-Desktop_Qt_5_4_2_MSVC2013_OpenGL_64bit-Debug
在main.cpp輸入下面代碼:
#include <QCoreApplication> #include <QDebug> #include <QLibrary> typedef void(*fun)();// 定義導出函數類型(這個函數類型要與dll中一致) int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QLibrary dll("dll.dll");//載入dll if(dll.load()){ fun sub=(fun)dll.resolve("sub_"); //根據dll中函數名,獲取dll中函數 if(sub){ qDebug()<<"成功!"; } else{ qDebug()<<"載入函數失敗!"; } } else{ qDebug()<<"載入dll失敗!"; } return a.exec(); }編譯顯示“成功!”則實現了對接。
4、dll的調用方式:
4.1、關於VC++ dll的調用:
動態鏈接庫(dll)的動態調用和靜態調用,靜態鏈接庫(static lib)的調用,這篇博文都講的非常清楚:
http://www.cnblogs.com/chio/archive/2007/11/03/948480.html
4.2、關於qt dll的調用方式:
qt dll的顯示調用(動態調用)和隱式調用(靜態調用),這篇博文講的非常清楚:
http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html
4.3、qt 創建與調用 dll/static lib:
qt 創建 dll 的時候在 .pro 中加入:
TEMPLATE = lib
(1)dll顯示調用:
我寫的這篇就是用Qlibrary的顯示調用,長處是僅僅須要.dll文件就能夠調用,不需在.pro中加LIB路徑
(2)dll隱式調用:
靜態調用往往還須要.h文件。在.pro中加入LIB += “絕對路徑\文件名稱.dll”(註意斜杠的方向\)
.cpp中聲明頭文件#include 文件名稱.h
qt 創建 static lib 的時候在 .pro 中加入:
TEMPLATE = lib
CONFIG += staticlib
(3)靜態鏈接庫:
假設是靜態庫還須要.lib/.a文件。並且要在.pro中先聲明.lib/.a
INCLUDEPATH += "絕對路徑"
LIB += “絕對路徑\文件名稱.lib” 或LIB += “絕對路徑\文件名稱.a”
.cpp中聲明頭文件#include 文件名稱.h
註:
qt中還能夠用QPluginLoader,這個請自行補腦,也須要.h等文件
qt中加入LIBS還能夠通過在.pro 右鍵->加入庫,然後選擇路徑
5、生成的dll中函數名的查看:
下載 depends 打開dll 能夠查看到當中的函數名
打開之前的dll,能夠看到當中的函數名 sub_
6、關於makefile和編程原理:
相信非常多人和我一樣對.lib/.a、.dll/.so、.obj/.o這些個文件之間的關系會感到非常困惑。讀懂以下這篇文章也差點兒相同懂了:
http://wenku.baidu.com/link?
url=FY5aNAyRmb73cWAaivKZuYY7coJhUm7kDBpQgzpM2X-hoXLPYqo89G_RHhZTk2uAqp7A03ekWw4di2B_ZdASHcSFxf4D9-f4tZELMElWWlC
還有這篇關於makefile使用方法的一些歸納:
http://wenku.baidu.com/link?url=ErxBlB_bWtPNhoNLIUpLepIbTuP0oU8tWcKlyxt0e92mep1HqCZkfD_lHSyjUPYxzh76caRKz-HbgFUM5XR_iNoH4v6A9HmFWTUw7I8LhiO
win64 qt與fortran (codeblocks) 混合編程