2008年7月2日 星期三

[Windows] Dev-C++ 編譯產生 DLL 檔

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



  1. 開啟 Dev-C++,建立新專案,選擇 [DLL]

  2. 預設便產生兩個檔案

    • dllmain.c

    • dll.h



  3. 接著,是關於自己開發的程式部分,例如:

    • test.h

      • void my_hello_world();





    • test.c


      • #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 改變成:


      • #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





  •  


    • 將所有 header file 中所有的 function,其前面皆加上 DLLIMPORT



      • 原先叫 void haha( int hehe );



      • 修改成 DLLIMPORT void haha( int hehe );





    • 稍微解說一下,由於我的程式分為 Windows 和 FreeBSD 版本,因此,當沒有 define  _EXPORT_DLL_ 時,代表正在 FreeBSD 環境,因此,我反而將DLLIMPORT 定義成空的,這樣就不會影響在 FreeBSD 的編譯囉!透過上述的步驟,就可使用 Dev-C++ 建立 DLL 檔囉!





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


2008年6月30日 星期一

幸福‧距離

幸福,到底有多遠呢?

[20070715] 眺望‧水煎包

有時我可像極了我家的小狗,死命地往一個點認真地盯著,然而,我常常也會發現,最後好像什麼也沒得到?呵,就像我家的小狗,最後沒得到吃的一般,但牠還是一樣地可愛,一樣地對我撒嬌,不像我,累了卻連頭也不想抬起來。

幸福的距離,到底有多遠呢?是一個轉身,還是半個世紀的追逐?
希望,我能夠接近它!就算不能如此地接近,也奢望像風箏一般,彷彿我的指尖,可以輕輕地與之共鳴。

2008年6月29日 星期日

人生總有無力時

上大學後,漸漸地發現自己的能力不斷地累積、昇華,有時也不禁意會讚嘆,哇,原來我也挺不賴!好像大四之後,碰到事情倒還算能夠處理,除了研究所考試這件事外,讀書我真的還不太擅長,或者是生活太多容易讓我分心的事吧!

直到最近,發現自己面對人生瑣事,越來越多、越來越雜的無力感慢慢地累積著。回想起國中強說愁的年代,以前是悠閒到沒事找事做,總挖一堆老成的文章、問題,然後問自己、別人,當時的悠閒心態,彷彿天塌下來也能無愧於天地,沒想到年紀增減,才知道真的不是那般簡單輕鬆,更不是耍嘴皮、耍耍帥可以解決的。

寫寫東西,希望能夠慢慢地消化掉這些心情,再次打起精神,面對、處理與接受。

2008年6月25日 星期三

Dev-C++ - wanna make with '-D'

    在工作站編譯時可以用 make -D define_variable 以此決定要用哪種 code

    最近使用 Dev-C++ 並且將自己寫的 code 從 FreeBSD 移值至 Windows
    常常使用一些系統相依性的函數 偶時需要 windows.h 或什麼的

    這時常用

    #ifdef _WORK_FOR_WIN32_

    #include <windows.h>
    #include <io.h>

    #endif

    現在 不必自行改 header file 去定義 _WORK_FOR_WIN32_
    可以透過 Dev-C++ :

        [專案]->[參數]->[編譯器]

        增加 -D _WORK_FOR_WIN32_

    原先摸很久找不太到 原來 -D 這個參數可以直接加到 gcc or g++ 啊
    現在編譯的方式又乾淨許多了  :D

暑假尚未開始

碩班的生活,沒想到期末考都很早地考完,唯一的缺點是我修了一門期末要上台報告的課,必需搞到七月初才能正式結束這學期的課程。

一不留意,已經在中正待了接近一年,去年我是在七月底進宿舍的。仔細回想,這一年嘛,說沒學到東西也不是,但總覺得心中有點空虛的感覺,大概是學了不少我認為出去工作再學就好的東西吧?說真的,我有種很想趕快畢業的念頭,同時也思考自己是不是適合往博班發展?總覺得博班才是做研究的開始,碩班像極打雜的掃地僧,各憑本事混吃混喝。前陣子猶疑,最近比較定下心了,我想,出去工作才是我想要的生活,未來若沒經濟壓力,加上能申請上的話,再回學校吧?

說得好像已經畢業似的。

下學期我還是想把行銷管理的課程好好地上過一遍,碩一上期中後因為常常膩於程式中,不久也作罷了。除此之外,還有不少課想去聽聽,不曉得未來的生活是否還能抓的穩步調呢?