在 Windows 環境建置動態連結函式庫 (Dynamic-link library),使用 MinGW gcc/g++ 以及 CodeBlock
整理在 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)
- 設定環境變數 PATH,加入指向安裝目錄底下的 bin,例如 C:\Program Files\mingw-w64[VERSION]\mingw64\bin
- 系統內容 > 進階 > 環境變數 > 修改 PATH
- 開啟命令提示字元 (cmd) 測試
或是使用 where 檢查 gcc 路徑$ 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
Install Code::Blocks
- 從官方網站下載最新版本的安裝程式
- 執行 Codeblocks,不管有沒有偵測任何的編譯器,先選擇 GNU GCC Compiler
- 開啟 Settings > Compilers … > Toolchain executions,修改安裝目錄、編譯器等設定
- 開啟 Settings > Debugger… > GDB/CDB debugger > default,設定 gdb 安裝位置 (偵錯模式)
- 更多可參考官方安裝文件:CodeBlock: MinGW installation
Sample Dynamic-link Library Project
- File > New > Project,建立 Shared library 專案
- Project > Properties > Build Targets,調整名稱 (Build target name) 與平台 (Platforms) 等設定
- Project > Build Options > Compiler settings > Other options,加入以下參數
- -m64:強迫使用 64 位元編譯
- -fPIC:使用相對位址定址 (position-independent code)
- 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 的可呼叫函式
關於 Linux 環境的安裝,可以參考以前寫的筆記:Compile C/C++ share object in Linux using GCC and G++。
沒有留言: