1. 程式人生 > >win64 qt與fortran (codeblocks) 混合編程

win64 qt與fortran (codeblocks) 混合編程

動態調用 nload core typedef 技術 dll libs return .com

本教程主要解說用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

\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) 混合編程