Visual Stdio C++コンパイラ、リンク共通コマンドラインオプションまとめ


以前はVisual Stdioを使用していたのはIDE環境でした.この2,3日GSLをコンパイルするのはIDE環境が特に不便なので、コマンドラインの下でVisual Stdio C++コンパイラ、コネクタを使用する方法を簡単に勉強しました.
個人的にはgccに詳しいので、ここのいろいろな使い方はgccの類比をしていて、これも記憶しやすいです.
コンパイラCL
Visual StdioのC/C++コンパイラはすべて同じで、CLと呼ばれています.次の表に、基本的なコマンドラインオプションを示します.
CL
gcc
説明
/E
-E
前処理結果の出力
/Fa
-S
出力アセンブリファイル
/Za
-ansi
言語拡張を禁止し、この2つはまだ等価ではありません.
/Dname
-Dname
コードにdefine nameが追加されたマクロに対してマクロを定義します.
/Dname=value
-Dname=value
コードに#define name valueが追加されたマクロに対してマクロを定義します.
/Wall
-Wall
すべての警告メッセージを全開にします.
/Od
-O0
最適化の禁止
/O1
-Os
省スペース化を目標に最適化
/O2
-O2
最速の許容速度を目標に最適化
/Idirecotry
-Idirecotry
ヘッダファイルの検索パスの指定
/c
-c
ターゲットファイルを生成します.obj,リンクしない
/libpath:direcotry
-Ldirecotry
ライブラリファイルの検索パスを指定します(MSVCの/libpathはリンクオプションに属し、最初のリンクオプションの前に/linkオプションを指定し、コンパイラにドライバを伝え、後続のオプションをリンクに渡して使用します)
/GR,/GR-
-frtti,-fno-rtti
RTTIのオン/オフ
/link
-Wl
リンク指定モジュールまたはリンクにパラメータを渡す
/LD
-shared
コンパイルDLLファイルの生成
/LDd
DLLファイルのコンパイル(デバッグ版)
/MD
動的マルチスレッドバージョンとライブラリMSVCRTを実行する.LIBリンク
/MDd
デバッグ版の動的マルチスレッドバージョンとライブラリMSVCRTDを実行する.LIBリンク
/MT
静的マルチスレッドバージョンとライブラリLIBCMTを実行する.LIBリンク
/MTd
デバッグ版の静的マルチスレッドバージョンとライブラリLIBCMTDを実行する.LIBリンク
これら以外にもコマンドラインの選択肢はたくさんありますが、一般的な用途ではこれで十分です.
コネクタlink
gccツールチェーンのldに対応します.
link
ld
説明
/BASE:address
出力ファイルのベースアドレスの指定
/DEBUG
デバッグモードバージョンの出力
/DEF:filename
モジュール定義ファイルを指定します.DEF
/DEFAULTLIB:library
デフォルトのライブラリの指定
/DLL
–relocateable
DLLを生成
/ENTRY:symbol
–entry=symbol
プログラムエントリの指定
/EXPORT:symbol
シンボルビットエクスポートシンボルの指定
/HEAP
デフォルトヒープサイズの指定
/LIBPATH:dir
リンク時のライブラリ検索パスの指定
/MAP:MAPFILE
-Map MAPFILE
リンクMAPファイルの生成
/NODEFAULTLIB
ライブラリのデフォルトの実行を禁止
/OUT:name
-o name
出力ファイル名をnameと指定
/STACK
デフォルトスタックサイズの指定
/SUBSYSTEM
サブシステムを指定します.一般的なオプションはwindowsとconsoleです.
静的ライブラリの生成ツールlib
libは一連のobjファイルを静的ライブラリにパッケージすることができる.lib.いくつかをlib合成lib.あるいはいくつかの.OBjと.lib合成lib.
例えばaddがありますobj sub.obj div.libの3つのファイルをallに合成したいです.lib. では、次のようにできます.
lib add.obj sub.obj div.lib /out:all.lib

この3つのファイルを1つのallにマージする場合.dllじゃあもう一つ必要だdefファイル.エクスポートする記号を示します.次のようになります.
LIBRARY   all.dll
EXPORTS
   add
   sub
   div

その後、linkコマンドを実行します.
link /SUBSYSTEM:windows /dll /def:all.def /out:all.dll add.obj sub.obj div.lib