Board logo

標題: [程式設計] [Windows] Dev-C++ 編譯產生 DLL 檔 [打印本頁]

作者: gswdkimo    時間: 2010-10-25 20:50     標題: [Windows] Dev-C++ 編譯產生 DLL 檔

這篇主要是用來紀錄自己如何使用 Dev-C++ 結合自己專案狀況,產生 DLL 檔,如果只是想單純將自己開發程式建立 DLL 的話,在此稍微地提示一下:

   1. 開啟 Dev-C++,建立新專案,選擇 [DLL]
   2. 預設便產生兩個檔案
          * dllmain.c
          * dll.h
   3. 接著,是關於自己開發的程式部分,例如:
          * test.h
                o void my_hello_world();
          * test.c
                o

                  #include "test.h"
                  void my_hello_world(){
                      printf("My Hello World\n");   
                  }
   4. 請參考 dll.h 中的敘述,上頭是將範例的 void HelloWorld (void); 輸出至 DLL
          * 仿照 dll.h 中的定義,依樣畫葫,替自己的 header file 加些敘述,從宣告的 function list 裡,將想要輸出至 DLL 的,前頭都加上個 DLLIMPORT 字樣,例如 test.h 改變成:
                o

                  #if BUILDING_DLL
                  # define DLLIMPORT __declspec (dllexport)
                  #else /* Not BUILDING_DLL */
                  # define DLLIMPORT __declspec (dllimport)
                  #endif /* Not BUILDING_DLL */

                  DLLIMPORT my_hello_world()
   5. 最後,則是編譯產生 DLL 檔
          * 別忘了在 dllmain.c 中,include 自己的 header file 啦
          * 編譯無誤後,在專案下會產生 *.def 檔案,裡頭會顯示已經被 export 至 dll 的 function list ,可用來查看是否成功啦!

以下,是我自己專案的筆記。

前陣子在 FreeBSD 上利用 C 語言開發一些程式,隨時面臨到 porting 至 Windows 的問題,所以,最後我選擇使用 Dev-C++ 來進行 porting ,甚至到最後我反而變成在 Windows 上開發,然後在移到 FreeBSD 執行。不斷地在 Windows 和 FreeBSD 之間遊走,常常就會需要 Makefile 和 *.dev 的協助,再搭配 #define 的方式,慢慢生得出共用的程式啦。最後,在 Windows 上使用 *.dev 編譯,在 FreeBSD 上則直接使用 make with Makefile 啦。

拉回主題,前陣子雖然產生了 static library ,但學長很習慣 Microsoft Visual Studio 環境,所以,便考慮生成 DLL 檔囉,經過幾番測試,碰巧讓我發現方法,記錄一下 :D

   1.
      開啟 Dev-C++ ,建立新專案,選擇 [DLL]
   2.
      接著預設有兩個檔案可供參考
          *
            dll.h
          *
            dllmain.c
   3.
      如果你是要重新撰寫程式,那可以照著 dll.h 的宣告方式,在你想要製成 DLL 的 function 前加上 DLLIMPORT 囉,等至程式寫完後,即可編譯生成 dll 檔,並且產生 *.def ,可用來查看函數列表。
   4.
      由於我的目錄是將已開發好的程式,進行產生 dll 檔案,因此,僅需保留與稍作修改dllmain.c,並將所有要建成 dll 使用到相關的 header file 和 src code 都加入此專案,並且 include 所有使用到的 header file 到 dllmain.c 中。在此,我恰好使用了一個 base.h 來代替 dll.h 檔,用來管理所有的 header file 。
   5.
      在第四點的條件下,我可以在 base.h 中加工一下
          *
            仿照 dll.h ,由於我的程式有分 FreeBSD 和 Windows 的環境,所以我使用 _WORK_FOR_WIN32_ 的資訊,讓我選擇要用 Windows 的 code 還是 Unix 的 code。以下的敘述是說,如果我編譯時下了 -D_EXPORT_DLL_ 和 -DBUILDING_DLL=1 ,那就會建立出 DLL 檔囉!

        #ifdef _EXPORT_DLL_
        #define _WORK_FOR_WIN32_
        #if BUILDING_DLL
        # define DLLIMPORT __declspec (dllexport)
        #else /* Not BUILDING_DLL */
        # define DLLIMPORT __declspec (dllimport)
        #endif /* Not BUILDING_DLL */
        #else
        # define DLLIMPORT
        #endif

    *  
          o
            將所有 header file 中所有的 function,其前面皆加上 DLLIMPORT
                +
                  原先叫 void haha( int hehe );
                +
                  修改成 DLLIMPORT void haha( int hehe );
          o
            稍微解說一下,由於我的程式分為 Windows 和 FreeBSD 版本,因此,當沒有 define  _EXPORT_DLL_ 時,代表正在 FreeBSD 環境,因此,我反而將DLLIMPORT 定義成空的,這樣就不會影響在 FreeBSD 的編譯囉!透過上述的步驟,就可使用 Dev-C++ 建立 DLL 檔囉!

這次發現編法,主要是先 Google 一些 keyword 後,發現有人在討論如何使用 Dev-C++ 將 cgicc 編譯成 DLL 檔,雖然上頭沒說什麼東西,但後來在 cgicc 的 header file 中翻到 EXPORT 等關鍵字,才發現原來就跟 dll.h 差不了多少嘛,茅塞頓開,馬上就解決問題啦!原先呆呆的,以為只要將 code 加入專案就能搞定,囧。




歡迎光臨 資訊家電班NO7 (http://imce07.freehostia.com/forums/) Powered by Discuz! 7.2