クロスプラットフォーム対応

1 概要

C 言語は Linux と Windows の両方で動作するコードを書けますが、OS やコンパイラによって異なる部分を吸収するための工夫が必要です。プリプロセッサマクロ (#ifdef#if defined) を使った条件コンパイルが主な手段で、OS の判別やコンパイラ固有の属性・宣言の差異を吸収します。

このリポジトリは Linux (GCC) と Windows (MSVC) の両方をサポートするクロスプラットフォーム設計になっています。prod/calc/include/libcalc.h では、Windows の DLL エクスポート宣言(__declspec(dllexport))と Linux の可視性属性(__attribute__((visibility("default"))))を条件コンパイルで切り替えています。同様のパターンは prod/ 配下の他のヘッダーファイルにも見られます。

ビルドシステム (makefile) 側でも OS やコンパイラの違いを吸収しており、makefw/ サブモジュールが Linux / Windows の差異をテンプレートとして提供しています。

2 習得目標

3 学習マテリアル

3.1 公式ドキュメント

4 このリポジトリとの関連

4.1 使用箇所 (具体的なファイル・コマンド)

クロスプラットフォーム宣言のパターン (prod/calc/include/libcalc.h の例):

/* DLL エクスポート/インポートのクロスプラットフォーム定義 */
#if defined(_WIN32) || defined(_WIN64)
  #ifdef LIBCALC_EXPORTS
    #define LIBCALC_API __declspec(dllexport)
  #else
    #define LIBCALC_API __declspec(dllimport)
  #endif
#else
  #define LIBCALC_API __attribute__((visibility("default")))
#endif

関連ファイル:

  • prod/calc/include/libcalc.h - 動的ライブラリのエクスポート宣言
  • prod/calc/include/libcalcbase.h - 静的ライブラリのヘッダー
  • prod/calc/include/libcalc_const.h - OS に依存しない定数定義

makefile での OS 判別 (makefw/ テンプレートより):

ifeq ($(OS),Windows_NT)
    # Windows 向けの設定
    SHARED_EXT := dll
    LIB_EXT    := lib
else
    # Linux 向けの設定
    SHARED_EXT := so
    LIB_EXT    := a
endif

4.2 関連ドキュメント