Boost.Build において,各ターゲットの種類に対してビルドプロパティの値が具体的にどのようなコマンドラインオプションに対応するかを, Linux + GCC + GNU Linker の環境において例示するという,私以外の誰も得をしないしそもそも他に理解できる人が居るのかすら怪しい表.(基本コマンド)に各ビルドプロパティに対応するオプションが付加されたものが実際に走るコマンドになる.
feature | value | obj (C++ ソースの場合) | obj (C ソースの場合) | lib (built shared) *1 | lib (built static) *2 | lib (prebuilt shared) *3 | lib (prebuilt static) *4 | exe | run |
---|---|---|---|---|---|---|---|---|---|
(基本コマンド) | "g++" -c -o "target" "source" | "g++" -x c -c -o "target" "source" | *5 | "ar" rc "target" "sources" | *6 | *7 | *8 | ※ | |
"ranlib" "target" | |||||||||
link | shared | -fPIC | -fPIC | N/A | N/A | ||||
static | N/A | N/A | |||||||
runtime-link | shared | ||||||||
static | N/A (ビルドエラー) | -static | |||||||
runtime-debugging | on | ||||||||
off | |||||||||
optimization | off | -O0 | -O0 | ||||||
speed | -O3 | -O3 | |||||||
space | -Os | -Os | |||||||
profiling | off | ||||||||
on | -pg | -pg | -pg | -pg | |||||
inlining | off | -fno-inline | -fno-inline | ||||||
on | -Wno-inline | -Wno-inline | |||||||
full | -finline-functions | -finline-functions | |||||||
-Wno-inline | -Wno-inline | ||||||||
threading | single | ||||||||
multi | -pthread | -pthread | -Wl,-Bdynamic -lrt | -Wl,-Bdynamic -lrt | |||||
-pthread | -pthread | ||||||||
rtti | on | ||||||||
off | -fno-rtti | -fno-rtti | |||||||
exception-handling | on | ||||||||
off | |||||||||
asynch-exceptions | off | ||||||||
on | |||||||||
extern-c-nothrow | off | ||||||||
on | |||||||||
debug-symbols | on | -g | -g | -g | -g | ||||
off | |||||||||
strip | off | ||||||||
on | -Wl,--strip-all | -Wl,--strip-all | |||||||
define | value | -Dvalue | -Dvalue | ||||||
undef | value | ||||||||
include | path | -I"path" | -I"path" | ||||||
cflags | value | value | value | ||||||
cxxflags | value | value | |||||||
fflags | value | ||||||||
asmflags | value | ||||||||
linkflags | value | value *9 | value | ||||||
archiveflags | value | value *10 | |||||||
version | value | ||||||||
flags | value | ||||||||
location-prefix | value | 調査中 | 調査中 | 調査中 | 調査中 | 調査中 | 調査中 | ||
use | target | (参照) | |||||||
dependency | target | (参照) | |||||||
implicit-dependency | target | 調査中 | 調査中 | 調査中 | 調査中 | 調査中 | 調査中 | 調査中 | 調査中 |
warnings | on | -Wall | -Wall | ||||||
all | -Wall | -Wall | |||||||
-pedantic | -pedantic | ||||||||
off | -w | -w | |||||||
warnings-as-errors | off | ||||||||
on | -Werror | -Werror | |||||||
c++-template-depth | n | -ftemplate-depth-n *11 | |||||||
source | target | (参照) | (参照) | (参照) | *12 | 挙動不明 | 挙動不明 | (参照) | (参照) |
library | target | *13 | ※ (同左) | 挙動不明 | 挙動不明 | *14 | |||
file | target | N/A | N/A | *15 | ※ (同左) | ||||
find-shared-library | value | -Wl,-Bdynamic -lvalue | -Wl,-Bdynamic -lvalue | ||||||
find-static-library | value | -Wl,-Bstatic -lvalue | -Wl,-Bstatic -lvalue | ||||||
library-path | path | -L"path" | -L"path" | ||||||
name | value | N/A | N/A | *16 | *17 | ||||
tag | value | (参照) | (参照) | (参照) | (参照) | 調査中 | 調査中 | (参照) | (参照) |
search | path | N/A | N/A | *18 | *19 | ||||
location | path | *20 | ※(同左) | ※(同左) | ※(同左) | ※(同左) | ※(同左) | ||
dll-path | path | -Wl,-R -Wl,"path" | -Wl,-R -Wl,"path" | LD_LIBRARY_PATH 環境変数に path を追加 | |||||
hardcode-dll-paths | true | *21 | |||||||
false | |||||||||
xdll-path | path | -Wl,-R -Wl,"path" *22 | LD_LIBRARY_PATH 環境変数に path を追加 | ||||||
-Wl,-rpath-link -Wl,"path" | |||||||||
def-file | target | ||||||||
suppress-import-lib | false | ||||||||
true | |||||||||
allow | value | ||||||||
address-model | (無指定) | ||||||||
32 | -m32 | -m32 | -m32 | -m32 | |||||
64 | -m64 | -m64 | -m64 | -m64 | |||||
c++abi | (無指定) | ||||||||
conditional | value | (参照) | |||||||
build | yes | (参照) | |||||||
no | |||||||||
user-interface | console | ||||||||
gui | |||||||||
wince | |||||||||
native | |||||||||
auto |
特記事項
まー,各バイナリフォーマットの話やリンカ・ローダのお仕事をほとんど把握してないのであれだけど,
- 実行ファイルリンク時の -rpath-link と実行ファイルを走らせるときの LD_LIBRARY_PATH を設定するために, DLL がビルドチェインに取り込まれたらそのパスを依存先に取回している.
- アーカイブファイル (静的ライブラリ) の扱いが非常に特殊.共有ライブラリやアーカイブファイルを他のアーカイブファイルのソースとして指定すると,アーカイブ内に追加せずに依存先に取回して,最後の最後,実行ファイルのリンク時にようやくリンク対象として列挙される.一見すると意味不明だけれど,こうしないと実態が重複して取り込まれたアーカイブができてまずいっぽい.リンカの探索が one-path なせいかしてこの環境だとそんな状況でも一応通る.ただし MSVC だとそういうアーカイブファイルのリンクはおそらく通らない.
- あと, PE との可搬性を考慮するなら,共有ライブラリはシンボル全部解決しておいたほうが良いはず.知らんけど?
- --no-allow-shlib-undefined なんてオプションあったのね.これを <linkflags> に設定しておきましょうそうしましょう.
*1:<link>shared が指定されていて,かつ, <name>value も <search>path も <file>value も指定されていない場合.
*2:<link>static が指定されていて,かつ, <name>value も <search>path も <file>value も指定されていない場合.
*3:<link>shared が指定されていて,かつ, <name>value か <search>path か <file>value かのどれか少なくとも一つが指定されている場合.
*4:<link>static が指定されていて,かつ, <name>value か <search>path か <file>value かのどれか少なくとも一つが指定されている場合.
*5:"g++" -o "target" -Wl,-h -Wl,target -shared -Wl,--start-group "sources" -Wl,--end-group
*6:実際の効果に関しては <name>, <search>, <file> の記述を参照すること.
*7:実際の効果に関しては <name>, <search>, <file> の記述を参照すること.
*8:"g++" -o "target" -Wl,--start-group "sources" -Wl,--end-group
*9:リンク時のフロントエンドとして g++ が使われるため,指定されたフラグは g++ のコマンドラインオプションとして渡される.フラグをリンカに直接渡したい場合は -Wl, を併用すること.
*11:1024 までの 32 の倍数,または 1000 までの 10 の倍数が設定できる.
*12:指定されたターゲットのうち, obj (および他の種類のターゲットから暗黙に生成された obj ターゲット) をアーカイブファイルに含める.それ以外の各々のターゲットについては usage-requirements に <library>target として追加されるのと同等.さらにすべてのソースに対する <use> が requirements に指定されるのと同等.
*13:ソースが空でない場合は target をソースに追加する.ソースが空の場合は挙動不明.
*14:ソースが空でない場合は target をソースに追加する.ソースが空の場合は挙動不明.
*15:ライブラリファイルへのフルパスを指定する. <name> と同時に使われることは想定されていない.効果としては usage-requirements に <library>"value" および <xdll-path>"dir" が指定されるのと同等.ここで dir は <file> で指定されたライブラリファイルが存在するディレクトリへのフルパス. Boost.Build のドキュメントも参照すること.
*16:ライブラリ名 (g++ や ld の -l コマンドラインオプションに与えるのと同じ名前規則による名前) を指定する. <file> と同時に使われることは想定されていない.効果としては usage-requirements に <linkflags>"-Wl,-Bdynamic -lvalue" が指定されるのと同等. <search>path と同時に指定された場合は usage-requirements に <xdll-path>"path" も指定されるのと同等. Boost.Build のドキュメントも参照すること.
*17:ライブラリ名 (g++ や ld の -l コマンドラインオプションに与えるのと同じ名前規則による名前) を指定する. <file> と同時に使われることは想定されていない.効果としては usage-requirements に <linkflags>"-Wl,-Bstatic -lvalue" が指定されるのと同等. <search>path と同時に指定された場合は usage-requirements に <xdll-path>"path" も指定されるのと同等. Boost.Build のドキュメントも参照すること.
*18:<name> の記述を参照すること.
*19:<name> の記述を参照すること.
*20:ターゲットの出力先パスが path に強制される.
*21:<hardcode-dll-paths> の効果を変化させる.詳細は <hardcode-dll-paths> の項を参照のこと.
*22:<hardcode-dll-paths>true が指定されている場合のみ.