關於 web service, unity, blogger 等軟體工程筆記

在 Windows 環境建置動態連結函式庫 (Dynamic-link library),使用 MinGW gcc/g++ 以及 CodeBlock

Edit icon 沒有留言
MinGW-w64 and Codeblocks,CodeBlocks icon credit by [Code::Blocks](http://www.codeblocks.org/)

整理在 Windows 環境下,編譯 C/C++ 產出動態連結函式庫 (Dynamic-link library) 給其他專案使用的筆記。

大部分的情況下,在 Windows 作業系統中,通常都使用 Microsoft 所推出的 Vistual Studio IDE 來管理以及建置 C/C++ 的專案,但由於其函式庫也需要在 Linux 作業系統下建置,所以採用 Codeblocks 這套可以跨平台的 IDE 來管理 (改用 Makefile 也是可以,但有點小麻煩)。

編譯器 (compiler) 則是採用 MinGW-w64 這套能跑在 Windows 的 gcc/ g++,來編譯建置整個動態連結函式庫。

Install MinGW-w64

  • SourceForge 的載點 下載 MinGW-w64,或是參考官方網站的說明
  • 執行安裝檔,Architecture 選擇 x86_64 (為了編譯 64 bits)
    安裝 MinGW-w64 設定頁,Architecture 選擇 x86_64

    安裝 MinGW-w64 設定頁,Architecture 選擇 x86_64

  • 設定環境變數 PATH,加入指向安裝目錄底下的 bin,例如 C:\Program Files\mingw-w64[VERSION]\mingw64\bin
    • 系統內容 > 進階 > 環境變數 > 修改 PATH
  • 開啟命令提示字元 (cmd) 測試
    $ gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER= (omitted...)
    Target: x86_64-w64-mingw32
    Configured with: (omitted...)
    Thread model: posix
    gcc version 7.3.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
    
    或是使用 where 檢查 gcc 路徑
    $ where gcc
    

Install Code::Blocks

  • 官方網站下載最新版本的安裝程式
  • 執行 Codeblocks,不管有沒有偵測任何的編譯器,先選擇 GNU GCC Compiler
    設定使用的編譯器

    設定使用的編譯器

  • 開啟 Settings > Compilers … > Toolchain executions,修改安裝目錄、編譯器等設定
    設定編譯器安裝位置與名稱

    設定編譯器安裝位置與名稱

  • 開啟 Settings > Debugger… > GDB/CDB debugger > default,設定 gdb 安裝位置 (偵錯模式)
    設定偵錯模式 GDB

    設定偵錯模式 GDB

  • 更多可參考官方安裝文件:CodeBlock: MinGW installation

Sample Dynamic-link Library Project

  • File > New > Project,建立 Shared library 專案
    建立 Shared library 專案

    建立 Shared library 專案

  • Project > Properties > Build Targets,調整名稱 (Build target name) 與平台 (Platforms) 等設定
    設定 Build target

    設定 Build target

  • Project > Build Options > Compiler settings > Other options,加入以下參數
    • -m64:強迫使用 64 位元編譯
    • -fPIC:使用相對位址定址 (position-independent code)
    設定編譯選項,編譯成 64 位元編譯

    設定編譯選項,編譯成 64 位元編譯

  • Project > Build Options > Compiler settings > #defines,加入 WINDOWS 預定義符號 (predefined symbols)
    設定預定義符號

    設定預定義符號

  • 加入範例標頭檔 example.h
    #ifndef EXAMPLE_H__
    #define EXAMPLE_H__
    
    #ifdef WINDOWS
       #define API __declspec(dllexport)
    #else
        #define API extern
    #endif
    
    #ifdef __cplusplus
    extern "C" {
    #endif // __cplusplus
    
       API int Sum(int a, int b);
       API int SumAll(const int* nums, int n);
    
    #ifdef __cplusplus
    }
    #endif // __cplusplus
    #endif // EXAMPLE_H__
    
  • 以及其實作檔 example.cpp
    #include "example.h"
    
    API int Sum(int a, int b){
       return a + b;
    }
    
    API int SumAll(const int* nums, int n){
       int r = 0;
       for (int i = 0; i < n; i++){
          r += nums[i];
       }
       return r;
    }
    
    
  • Build > Build,建置編譯專案
  • 可使用 Dependency walker 檢查該 DLL 的可呼叫函式
    查看 example.dll 的可呼叫函式

    查看 example.dll 的可呼叫函式

關於 Linux 環境的安裝,可以參考以前寫的筆記:Compile C/C++ share object in Linux using GCC and G++

沒有留言: