基本データ型
- int 整数型 4byte
- float 単精度浮動小数点型 4byte
- double 倍精度浮動小数点型 8byte
- char 文字型 1byte
コンパイルツール:cl
ex)
cl /c HelloWorld.c
/cはコンパイルのみ行うオプション。自動リンクを行わない。
リンカー:link
書式:link オブジェクトファイル1 2 … N /OUT:EXEファイル名
プログラムの実行に必要なオブジェクトファイルが指定されていないと、以下のようにエラーとなる。
ex)
HelloWorld.obj : error LNK2019: 未解決の外部シンボル _printf が関数 _main で参照
されました。
LINK : error LNK2001: 外部シンボル "_mainCRTStartup" は未解決です。
HelloWorld.exe : fatal error LNK1120: 2 件の未解決の外部参照
objのシンボルテーブルを確認すると、何が足りないのか発見できる。
オブジェクトファイルの内容確認:dumpbin
ex)
dumpbin HelloWorld.obj /SYMBOLS
COFF SYMBOL TABLE
000 00CEEB9B ABS notype Static | @comp.id
001 80000191 ABS notype Static | @feat.00
002 00000000 SECT1 notype Static | .drectve
Section length 2F, #relocs 0, #linenums 0, checksum
004 00000000 SECT2 notype Static | .debug$S
Section length 68, #relocs 0, #linenums 0, checksum
006 00000000 SECT3 notype Static | .data
Section length D, #relocs 0, #linenums 0, checksum 9806FD4
008 00000000 SECT3 notype Static | $SG2940
009 00000000 SECT4 notype Static | .text
Section length 14, #relocs 2, #linenums 0, checksum F829D91
00B 00000000 UNDEF notype () External | _printf
00C 00000000 SECT4 notype () External | _main
上の_printfがUNDEFになっている。これが発見できなかったシンボル。
EXEファイルのスタートアップルーチン
スタートアップルーチン:_mainCRTStartup
EXEファイルの実行開始位置。main関数の呼び出し元。
以下で内容を確認できる。
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\crt0.c
この中で、_mainCRTStartupが__mainCRTStartupを呼び出し、_tmainを呼び出していることがわかる。引数は、mainの引数と同じ、引数の個数、コマンドライン引数の配列、環境変数の配列。
規定のライブラリリンク
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcmt.lib
安全のために、上記libを任意のディレクトリにコピーしたあと、下記を実行すると、temp.txtにデフォルトオブジェクトの一覧を記述できる。
lib libcmt.lib /LIST:temp.txt
この中に、printf.objなどの普段何気なく使用するシンボルが並んでいる。
このようにlinkし、エラーとなったオブジェクトをlinkに加えと繰り返すことでリンクを完了させることができる。
次はEXEファイルの構成。