Boost.Build @ Linux + GCC + GNU Linker

Boost.Build において,各ターゲットの種類に対してビルドプロパティの値が具体的にどのようなコマンドラインオプションに対応するかを, Linux + GCC + GNU Linker の環境において例示するという,私以外の誰も得をしないしそもそも他に理解できる人が居るのかすら怪しい表.(基本コマンド)に各ビルドプロパティに対応するオプションが付加されたものが実際に走るコマンドになる.

featurevalueobj (C++ ソースの場合)obj (C ソースの場合)lib (built shared) *1lib (built static) *2lib (prebuilt shared) *3lib (prebuilt static) *4exerun
(基本コマンド) "g++" -c -o "target" "source""g++" -x c -c -o "target" "source"*5"ar" rc "target" "sources"*6*7*8
"ranlib" "target"
linkshared-fPIC-fPICN/AN/A
staticN/AN/A
runtime-linkshared
staticN/A (ビルドエラー)-static
runtime-debuggingon
off
optimizationoff-O0-O0
speed-O3-O3
space-Os-Os
profilingoff
on-pg-pg-pg-pg
inliningoff-fno-inline-fno-inline
on-Wno-inline-Wno-inline
full-finline-functions-finline-functions
-Wno-inline -Wno-inline
threadingsingle
multi-pthread-pthread-Wl,-Bdynamic -lrt-Wl,-Bdynamic -lrt
-pthread-pthread
rttion
off-fno-rtti-fno-rtti
exception-handlingon
off
asynch-exceptionsoff
on
extern-c-nothrowoff
on
debug-symbolson-g-g-g-g
off
stripoff
on-Wl,--strip-all-Wl,--strip-all
definevalue-Dvalue-Dvalue
undefvalue
includepath-I"path"-I"path"
cflagsvaluevaluevalue
cxxflagsvaluevalue
fflagsvalue
asmflagsvalue
linkflagsvaluevalue *9value
archiveflagsvaluevalue *10
versionvalue
flagsvalue
location-prefixvalue調査中調査中調査中調査中調査中調査中
usetarget参照
dependencytarget参照
implicit-dependencytarget調査中調査中調査中調査中調査中調査中調査中調査中
warningson-Wall-Wall
all-Wall-Wall
-pedantic-pedantic
off-w-w
warnings-as-errorsoff
on-Werror-Werror
c++-template-depthn-ftemplate-depth-n *11
sourcetarget(参照)(参照)(参照)*12挙動不明挙動不明(参照)(参照)
librarytarget*13※ (同左)挙動不明挙動不明*14
filetargetN/AN/A*15※ (同左)
find-shared-libraryvalue-Wl,-Bdynamic -lvalue-Wl,-Bdynamic -lvalue
find-static-libraryvalue-Wl,-Bstatic -lvalue-Wl,-Bstatic -lvalue
library-pathpath-L"path"-L"path"
namevalueN/AN/A*16*17
tagvalue(参照)(参照)(参照)(参照)調査中調査中(参照)(参照)
searchpathN/AN/A*18*19
locationpath*20※(同左)※(同左)※(同左)※(同左)※(同左)
dll-pathpath-Wl,-R -Wl,"path"-Wl,-R -Wl,"path"LD_LIBRARY_PATH 環境変数path を追加
hardcode-dll-pathstrue*21
false
xdll-pathpath-Wl,-R -Wl,"path" *22LD_LIBRARY_PATH 環境変数path を追加
-Wl,-rpath-link -Wl,"path"
def-filetarget
suppress-import-libfalse
true
allowvalue
address-model(無指定)
32-m32-m32-m32-m32
64-m64-m64-m64-m64
c++abi(無指定)
conditionalvalue参照
buildyes参照
no
user-interfaceconsole
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, を併用すること.

*10:arコマンドラインオプションとして渡される.

*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 が指定されている場合のみ.