はじめに
「GPLは使いたいけど、強すぎるコピーレフトが企業利用の障壁になる」
─そんな課題を解決するために生まれたのがLGPL(GNU Lesser General Public License)です。
「弱いコピーレフト」と呼ばれる仕組みにより、ライブラリをプロプライエタリソフトウェアから利用できる柔軟性を提供しながら、ライブラリ自体の自由は確実に保護します。
企業での採用事例も多く、バランスの取れたライセンスとして注目されています。
LGPLライセンスとは
LGPLは、Free Software Foundation(FSF)によって開発された「弱いコピーレフト」型オープンソースライセンスです。
正式には「GNU Lesser General Public License」(以前は「GNU Library General Public License」)と呼ばれ、GPLの制約を緩和したライブラリ向けライセンスとして設計されました。
現在主流となっているのは以下の2つのバージョンです:
- LGPL v2.1(1999年リリース):最も広く使用されているバージョン
- LGPL v3(2007年リリース):GPL v3と同時期にリリース、現代的な保護機能を追加
主な特徴
1. 弱いコピーレフト(Weak Copyleft)
LGPLの最大の特徴は「弱いコピーレフト」です:
- ライブラリ自体の改変:LGPL v3で公開が必須
- ライブラリの利用:利用するアプリケーションは任意のライセンスでOK
- 動的リンク:一般的に派生作品とみなされない
- 静的リンク:特別な条件下で可能
2. 段階的なソースコード公開義務
- LGPLライブラリの改変部分のみソース公開が必須
- アプリケーション本体のソース公開は不要
- ただし、ユーザーがライブラリを差し替えできる仕組みの提供が必要
3. 特許保護(LGPL v3のみ)
- GPL v3と同様の特許ライセンス付与
- 特許訴訟からの保護機能
- DRM対策とTivoization対策も含む
4. リバースエンジニアリング権利
- LGPL v2.1: デバッグ目的のリバースエンジニアリング権利を保護
- LGPL v3: より明確で包括的なリバースエンジニアリング権利を保護
5. リンク方式による影響範囲の制御
LGPLでは、ライブラリとの結合方法によって影響範囲が変わります:
動的リンク(推奨)
# 実行時にライブラリを読み込み
./myapp → libexample.so (LGPL)
→ アプリケーションは任意のライセンスでOK
静的リンク(条件付き可能)
# コンパイル時にライブラリを組み込み
myapp (contains LGPL code)
→ 特別な条件を満たせば可能
LGPLライセンスの全文
LGPLライセンスの全文は各バージョンで確認できます:
- LGPL v2.1:GNU Lesser General Public License v2.1
- LGPL v3:GNU Lesser General Public License v3.0
LGPL v3の構成(主要セクション):
LGPL v3は独立したライセンスではなく、GPL v3への追加許可のセットとして構造化されています:
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Additional permissions under GNU GPL version 3 section 7.
0. Additional Definitions.
1. Exception to Section 3 of the GNU GPL.
2. Conveying Modified Versions.
3. Object Code Incorporating Material from Library Header Files.
4. Combined Works.
5. Combined Libraries.
6. Revised Versions of this License.
※ GPL v3の全条項が基盤として適用される
LGPL v3は独立したライセンスではなく、GPL v3への追加許可のセットとして構造化されていますが、実際の配布時にはLGPL v3のテキストファイルのみを含めることで十分です。
※日本語訳についてはこちらをご参照ください。
何ができるのか
ライブラリ利用者として
1. 柔軟な商用利用
- プロプライエタリアプリケーションからの利用が可能
- 動的リンクなら、アプリケーションのソース公開不要
- 商用製品での採用ハードルが低い
2. 改変の自由(制限あり)
- ライブラリの改変は可能
- ただし改変部分はLGPLで公開が必須
- バグフィックスや機能追加のコントリビューションを促進
3. 配布時の要件
動的リンクの場合:
- LGPLライブラリのライセンステキストを含める
- 使用しているLGPLライブラリの情報を明記
- ライブラリの差し替えが可能な仕組みを提供(通常は動的リンクで自動的に満たされる)
ライブラリ開発者として
1. コピーレフトによる保護
- ライブラリの改変版も確実にオープンソースになる
- コミュニティへの改変の還元を促進
- フォークされても自由を維持
2. 企業採用の促進
- GPLより採用ハードルが低い
- 企業からの貢献やフィードバックを得やすい
- エコシステムの拡大を期待できる
LGPLのコピーレフトの仕組み
LGPLの「弱いコピーレフト」について詳しく説明します:
1. 影響範囲の限定
========================================
アプリケーション (任意のライセンス)
========================================
動的リンク
========================================
LGPLライブラリ (LGPL必須)
- ライブラリのコア
- 改変部分 (LGPL必須)
- 派生ライブラリ (LGPL必須)
========================================
2. リンク方式による違い
動的リンク(Dynamic Linking)
// アプリケーション側(任意のライセンス)
#include <lgpl_library.h> // ヘッダファイルのみ
int main() {
lgpl_function(); // 実行時に動的ライブラリを読み込み
return 0;
}
→ 推奨方式:最も制約が少ない
静的リンク(Static Linking)
静的リンクは条件付きで可能ですが、追加の義務が発生するため注意が必要です:
// 静的リンクの例(条件付きで可能)
// コンパイル時にライブラリを組み込み
myapp (contains LGPL library code)
静的リンク時の追加義務:
- アプリケーションのオブジェクトファイル提供:ユーザーがライブラリを差し替えて再ビルドできるようにする
- LGPLライブラリのソースコード提供:改変可能にするため
- 再ビルド手順の提供:具体的な再リンク方法を説明
→ 実際の推奨:複雑な要件があるため、動的リンクの使用を強く推奨
3. 境界の明確化
LGPLでは以下が重要な境界となります:
「ライブラリ」に含まれるもの(LGPL適用):
- ライブラリのソースコード
- ライブラリの改変部分
- ライブラリから派生した新しいライブラリ
「アプリケーション」に含まれるもの(LGPL適用外):
- ライブラリを使用するアプリケーションコード
- アプリケーション固有のロジック
- 他のライブラリ(LGPL以外)
注意すべき点
1. 静的リンク時の詳細要件
静的リンクでLGPLライブラリを使用する場合は、ユーザーがライブラリを改変して再利用できる仕組みを提供する必要があります:
配布時に必要なファイル:
myapp-distribution/
├── bin/
│ └── myapp # 実行ファイル
├── build-materials/
│ ├── app.o # アプリケーションのオブジェクトファイル
│ ├── other_libs.a # 他の静的ライブラリ
│ ├── lgpl_lib_source/ # LGPLライブラリのソースコード
│ ├── Makefile # 再リンク用ビルドスクリプト
│ └── rebuild_instructions.txt # 具体的な再ビルド手順
└── licenses/
└── LGPL-3.0.txt # ライセンステキスト
目的: エンドユーザーがLGPLライブラリを改変した場合でも、その改変版を使ってアプリケーションを再構築できるようにするため
実用的な推奨: これらの要件は複雑なため、可能な限り動的リンクの使用を推奨します。
2. ヘッダファイルの取り扱い
// LGPLライブラリのヘッダファイル
#ifndef LGPL_LIBRARY_H
#define LGPL_LIBRARY_H
// このマクロ定義がアプリケーションにコピーされる
#define COMPLEX_ALGORITHM(x) \
((x) * 42 + magic_number) // 大量のコードを含む場合は注意
void simple_function(int param);
#endif
注意点: LGPLライブラリのヘッダファイルに大量の実装コード(巨大なマクロやインライン関数)が含まれている場合、それらがアプリケーションにコピーされることで、アプリケーション全体がLGPLの制約を受ける可能性があります。
3. 組み込みシステムでの考慮事項
LGPL v2.1の場合
- 一般的に組み込みシステムでも利用可能
- 動的リンクによる差し替え可能性の確保が重要
LGPL v3の場合
- GPL v3と同様のTivoization対策が適用
- ハードウェアでの改変制限が禁止される
- 組み込み機器での採用には慎重な検討が必要
4. ライセンス互換性
LGPL → 他のライセンスへの統合:
- MIT、BSD:動的リンクなら可能
- Apache-2.0:LGPL v3なら可能(v2.1は注意が必要)
- GPL:任意のバージョンで可能(アップグレード)
他のライセンス → LGPLライブラリへの統合:
- MIT、BSD:可能(LGPLでライセンス統一)
- Apache-2.0:LGPL v3なら可能
- GPL:LGPL部分がGPLにアップグレード
他のライセンスとの比較
ライセンス | コピーレフト強度 | 商用利用制約 | ライブラリ適性 | 特許保護 |
---|---|---|---|---|
LGPL v3 | 弱い | 最小限 | 非常に高い | あり |
LGPL v2.1 | 弱い | 最小限 | 非常に高い | なし |
GPL v3 | 強い | ソース公開必須 | 低い | あり |
Apache-2.0 | なし | なし | 高い | あり |
MIT | なし | なし | 高い | なし |
MPL-2.0 | ファイル単位 | 最小限 | 中程度 | あり |
実際の使用例
LGPLは多くの重要なライブラリで採用されています:
システムライブラリ
- glibc – GNU C Library(LGPL v2.1 or later)
GUIライブラリ
- Qt – クロスプラットフォームアプリケーションフレームワーク(LGPL v3 / Commercial のデュアルライセンス ※1)
※1 デュアルライセンス:オープンソースプロジェクトはLGPL v3で無料利用可、プロプライエタリ製品では商用ライセンス購入が必要
数値計算ライブラリ
- GNU MP (GMP) – 多倍長整数演算ライブラリ(LGPL v3 / GPL v2のデュアルライセンス ※3)
※3 デュアルライセンス:利用者がLGPL v3またはGPL v2のいずれかを選択可能(通常はLGPL v3を選択)
その他
- Cairo – 2Dグラフィックスライブラリ(LGPL v2.1 / MPL v1.1のデュアルライセンス ※2)
※2 デュアルライセンス:利用者がLGPL v2.1またはMPL v1.1のいずれかを選択可能
開発者として気をつけること
ライブラリをLGPLで公開する場合
1. LICENSEファイルの作成
# LGPL v3の場合
curl https://www.gnu.org/licenses/lgpl-3.0.txt > LICENSE
# LGPL v2.1の場合
curl https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt > LICENSE
2. ソースファイルへのヘッダー追加
/*
* Copyright (C) [year] [fullname]
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
3. README.mdでの表示
## License
This library is licensed under the GNU Lesser General Public License v3.0 - see the [LICENSE](LICENSE) file for details.
### Using this library in your applications
You can use this library in both open source and proprietary applications:
- **Dynamic linking**: Recommended. Your application can use any license.
- **Static linking**: Possible but requires additional obligations.
See [LGPL-3.0 FAQ](https://www.gnu.org/licenses/gpl-faq.html#LGPLStaticVsDynamic) for details.
### Contributing
Contributions to this library must be licensed under LGPL v3.0.
4. CMakeでの動的ライブラリ設定
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyLGPLLibrary)
# 動的ライブラリとして構築(推奨)
add_library(mylib SHARED
src/core.c
src/utils.c
)
# ヘッダーファイルのインストール
target_include_directories(mylib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# pkgconfigファイルの生成
configure_file(mylib.pc.in mylib.pc @ONLY)
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc
DESTINATION lib/pkgconfig)
LGPLライブラリを利用する場合
1. 動的リンクの設定(推奨)
# Makefile例
CC = gcc
CFLAGS = -Wall -O2
LDFLAGS = -lmylgpllib # 動的リンク
myapp: main.o
$(CC) -o $@ $^ $(LDFLAGS)
main.o: main.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f *.o myapp
2. ライセンス表示の追加
// アプリケーションのabout画面やヘルプに追加
void show_license_info() {
printf("This application uses the following libraries:\n");
printf("- MyLGPLLib v1.0 (LGPL v3.0)\n");
printf(" Copyright (C) 2024 Library Author\n");
printf(" License: https://www.gnu.org/licenses/lgpl-3.0.html\n");
}
3. 静的リンク時の追加対応
静的リンクを選択する場合:
# 配布物に含める必要があるファイル
├── myapp/
│ ├── bin/
│ │ └── myapp # 実行ファイル
│ ├── source/
│ │ ├── app_objects/ # アプリケーションのオブジェクトファイル
│ │ ├── lgpl_library/ # LGPLライブラリのソースコード
│ │ ├── Makefile # 再リンク用
│ │ └── README_REBUILD.txt # 再リンク手順
│ └── licenses/
│ └── LGPL-3.0.txt # LGPLライセンステキスト
4. 組み込みシステムでの考慮事項
// 組み込みシステムでのLGPLライブラリ使用例
#include <lgpl_networking.h>
// ファームウェア更新機能を提供
void firmware_update_check() {
// LGPLライブラリを使用した機能
if (lgpl_check_connection()) {
// ユーザーがLGPLライブラリを差し替えできる仕組みが必要
// → 動的ライブラリとして実装
// → またはファームウェア更新機能でライブラリ更新を可能にする
}
}
LGPL v2.1とLGPL v3の違い
1. 特許保護
- LGPL v2.1:特許条項なし
- LGPL v3:GPL v3と同様の特許ライセンス付与
2. Tivoization対策
- LGPL v2.1:ハードウェア制限に関する明確な規定なし
- LGPL v3:ハードウェアでの改変制限を禁止
3. DRM対策
- LGPL v2.1:DRMに関する言及なし
- LGPL v3:DRM回避の権利を保護
4. ライセンス互換性
- LGPL v2.1:Apache-2.0との互換性に注意が必要
- LGPL v3:Apache-2.0と互換性あり
5. 適用範囲
どちらも同じ「弱いコピーレフト」モデルを採用:
- ライブラリ自体の改変はLGPLで公開必須
- 動的リンクでの利用はアプリケーションのライセンスに影響なし
ビジネスモデルへの影響
LGPLに適したビジネスモデル
1. オープンコアライブラリ
- 基本機能をLGPLで提供
- 高度な機能は商用ライセンスで提供
- 例:Qt(LGPLとCommercialのデュアルライセンス)
2. サポートサービスモデル
- ライブラリ自体は無料提供
- サポート、カスタマイズ、コンサルティングで収益
- 企業向けサポート契約
3. エコシステム戦略
- ライブラリを無料で提供してエコシステムを構築
- 関連ツール、サービス、トレーニングで収益化
- デベロッパー向けプラットフォーム展開
4. フリーミアムモデル
- 基本ライブラリをLGPLで提供
- プレミアム機能、パフォーマンス向上版を有償提供
- クラウドサービスとの組み合わせ
LGPLライブラリの採用メリット
企業にとってのメリット
- 低い採用ハードル:プロプライエタリ製品での利用が可能
- リスクの軽減:アプリケーション本体のソース公開不要
- 活発なコミュニティ:バグフィックスや機能改善の恩恵
- 長期的な安定性:オープンソースによる継続性保証
開発者にとってのメリット
- 企業採用の促進:GPLより採用されやすい
- 貢献の増加:企業からのフィードバックや改善
- エコシステムの拡大:周辺ツールやサービスの発展
- 自由の保護:ライブラリ自体の自由は確実に維持
まとめ
LGPLは、GPLの強力なコピーレフトと完全なパーミッシブライセンスの中間に位置する、バランスの取れたライセンスです。「弱いコピーレフト」により、ライブラリの自由を保護しながら、企業での採用ハードルを大幅に下げることに成功しています。
LGPLを選ぶべき場合:
- ライブラリやフレームワークの開発
- 企業採用を重視するオープンソースプロジェクト
- エコシステムの拡大を目指す場合
- GPLは強すぎるが、完全なパーミッシブは弱すぎると感じる場合
LGPLを利用する場合の推奨事項:
- 動的リンクでの利用を推奨
- 静的リンクは追加要件を十分理解してから採用
- 組み込みシステムではLGPL v2.1を検討
- ライセンス条項の遵守(著作権表示等)
バージョン選択の指針:
- LGPL v2.1:組み込みシステムや幅広い互換性を重視する場合
- LGPL v3:特許保護やDRM対策を重視する場合
LGPLは、オープンソースの理念を尊重しながら、実用的なビジネス需要にも応える優れたライセンスです。ライブラリ開発者と利用者の両方にメリットをもたらすバランスの取れた設計により、多くのプロジェクトで採用され続けています。
用語解説
弱いコピーレフト:派生作品の一部(通常はライブラリ部分)のみにコピーレフトが適用される仕組み。強いコピーレフト(GPL)と比べて影響範囲が限定的。
動的リンク:プログラム実行時にライブラリを読み込む方式。ライブラリファイル(.so、.dll等)が独立して存在し、実行時に結合される。
静的リンク:コンパイル時にライブラリをプログラムに組み込む方式。最終的な実行ファイルにライブラリのコードが含まれる。
Tivoization:ハードウェアでソフトウェアの改変を技術的に制限すること。LGPL v3では禁止されている。
デュアルライセンス:同じソフトウェアが複数のライセンスで提供され、利用者が用途に応じて選択できる仕組み。
この記事は一般的な情報提供を目的としており、法的アドバイスではありません。具体的な法的問題については、専門家にご相談ください。