Version 15.25
「プロジェクトの設定」リンク編(2)
「それでは前回の続き、【プロジェクトの設定】ダイアログの【リンク】
ページの【バージョン情報】から」
『バージョン情報って、ダイアログにもあるし、リソースにもあるよね』
「その両方とも違います。このバージョン番号は Exe や DLL に埋め込むも
ので、実際、ほとんど使いません」
『なんだ、そうなんだ』
「では次」
『って、それなら前回やればいいじゃん!』
「次は【インプット】ページ」
『聞いてないし……』
「まず最初の【オブジェクト/ライブラリ モジュール】は、【一般】ページ
のものと同じです」
『あ、ホントだ、片方入力したらもう片方も、ね』
「次の【無視するライブラリ】は、使用しないライブラリファイルを指定し
ます」
『【C/C++】の【次のシンボルを無効にする】と同じ?』
「近いものかな。ここに kernel32.lib を書き込んでリビルドしてみて」
『ほい。うわ、エラー出まくり』
Main.obj : error LNK2001:
外部シンボル "__imp__OutputDebugStringA@4" は未解決です
LIBCD.lib(dbgrpt.obj) : error LNK2001:
外部シンボル "__imp__OutputDebugStringA@4" は未解決です
LIBCD.lib(wincrt0.obj) : error LNK2001:
外部シンボル "__imp__GetModuleHandleA@4" は未解決です
...
「 kernel32.lib は Win32API には必須のライブラリファイルだからね」
『これを無効にしたらこうなっちゃうわけね』
「【デフォルト ライブラリをすべて無視】は全ライブラリを無視するから
同じような感じになります」
『使わないねこれも』
「【明示的に参照するシンボル】は、関数やグローバル変数が最適化で削除
されないようにするもの」
『使ってないのだと削除されるってこと?』
「そういうこと。その削除をさせなくするのがこの設定だから、逆に言うと
最適化をしなかったら意味がないってこと」
『これも使わないわけね』
「最後の【追加ライブラリのパス】はおなじみのだね」
『 Version 15.07 ( No.307 ) のだね』
「この設定と【オブジェクト/ライブラリ モジュール】の組み合わせで、
ライブラリファイルを指定します」
『次は【カスタマイズ】ページね』
「【インクリメンタル リンクを行う】は Version 15.24 ( No.324 ) のも
のと同じ」
『デバッグ中にプログラムを修正できるようになるんだよね』
「そういうこと。とりあえずオンがいいかな」
『次の【プログラム データベースを使用】って、デバッグに使う.pdb
ファイルのこと?』
「そう、 Version 15.19 ( No.319 ) で説明したプログラムデータベースの
こと。これをオンにして、【プログラムデータベース名】にファイル名を指
定することで、プログラムデータベースが作られます」
『これを指定しないと出力されないってことね』
「次の【出力ファイル名】は【一般】ページのものと同じ」
『 Exe や DLL を指定するのね。【ターゲットを強制的に出力】って?』
「これは一部のリンクエラーが発生しても無理矢理 Exe や DLL を出力する
設定」
『……それってまずくない?』
「うん、だからこれは指定しない方がいいかな」
『次の【詳細情報の出力】は?』
「これは、リンク時の情報が出力されます」
リンク中...
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
DLLTestHard.lib /stack:0x10000000,0x100000 /subsystem:windows
/verbose /incremental:yes "/pdb:Debug/BuildTest.pdb" /debug
/machine:I386 "/out:Debug/BuildTest.exe" /pdbtype:sept
"/libpath:D:\Program\DLLTestHard\Debug"
".\Debug\Main.obj"
パス 1 を開始します
/DEFAULTLIB: uuid.lib オプションで処理を行いました
/DEFAULTLIB: LIBCD オプションで処理を行いました
/DEFAULTLIB: OLDNAMES オプションで処理を行いました
ライブラリを検索しています
D:\Program\DLLTestHard\Debug\DLLTestHard.lib を検索しています:
D:\Microsoft Visual Studio\VC98\LIB\uuid.lib を検索しています:
D:\Microsoft Visual Studio\VC98\LIB\LIBCD.lib を検索しています:
__chkesp が見つかりました
Main.obj で参照されています
LIBCD.lib(chkesp.obj) をロードしました
_WinMainCRTStartup が見つかりました
...
ライブラリの検索が終了しました
パス 1 が終了しました
パス 2 を開始します
Main.obj
LIBCD.lib(_freebuf.obj)
...
パス 2 が終了しました
『……なんかすっごく長いんだけど』
「リンクはいろんなライブラリファイルを参照するから、これだけの情報が
出力されるんだよね。どういったライブラリファイルを参照して、どの関数
と結び付けているのか、っていうのを確認するときには便利かな」
『それ以外はオフね』
「【開始メッセージを表示しない】は、【C/C++】のと同じ」
『じゃあリンクするときの設定とかが出力されるんだ』
「そういうこと」
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
DLLTestHard.lib /stack:0x10000000,0x100000 /subsystem:windows
/incremental:yes "/pdb:Debug/BuildTest.pdb" /debug /machine:I386
"/out:Debug/BuildTest.exe" /pdbtype:sept
"/libpath:D:\Program\DLLTestHard\Debug"
".\Debug\Main.obj"
『こういうのが最初に出力されるわけね』
「特に必要なければオンで」
『次が最後のページね』
「【デバッグ】ページでは、その名の通りデバッグ用の情報を出力します」
『デバッグ用の情報、って、プログラムデータベースじゃないの?』
「そう、そのファイルの種類についての設定をここでします。まず、
【デバッグ情報】のチェックをオフにすると、デバッグ用のファイルが出力
されません」
『.pdbファイルが作られないわけね』
「っていうわけじゃないんだよね。その下の3つは、出力するファイルの種
類。一番上の【Microsoft フォーマット】がプロジェクトデータベース」
『これを選ぶと.pdbファイルが作られるわけね』
「その下の【COFF フォーマット】っていうのを選ぶと、.asmファイルが作
られます。これは Visual C++ 以外の開発環境でデバッグするときに使用し
ます」
『他でデバッグなんてできるんだ』
「もちろん。ちなみに【COFF】は【Common Object File Format】の略。こ
の.asmファイルの中身はこんな感じになっています」
TITLE D:\Program\BuildTest\Main.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
(略)
rep stosd
; 14 : OutputDebugString( "あいうえお\n" );
mov esi, esp
(略)
ret 16 ; 00000010H
_WinMain@16 ENDP
_TEXT ENDS
END
『あ、なんだかプログラムらしきものが!』
「 OutputDebugString() がある行の左、【14】っていうっていう数字は
行番号です」
『なるほど、デバッグ用のファイルっぽいね』
「まぁ結局、 Visual C++ で開発してるときには必要ないかな。一番下の
【両方のフォーマット】を選ぶと、.pdbファイルと.asmファイルの両方が出
力されます」
『まさに両方ね』
「【他の種類】は、プログラムデータベースに保存する情報を分散するか
ひとつにまとめるかを決めます。チェックをオンにすると、.pdbファイルの
ファイルサイズが変わるから見てみて」
『ん、チェック外してリビルド……あ、ファイルサイズが大きくなった』
「なので、これはオンにしておいた方がいいかな」
『最後の【MAP ファイルを生成する】は?』
「その名の通り、.mapファイルを生成します。隣のファイル名を指定する欄
で指定したファイル名で、こんな感じのファイルが作られます」
BuildTest
Timestamp is 4336f2bb (Mon Sep 26 03:55:55 2005)
Preferred load address is 00400000
Start Length Name Class
0001:00000000 000108e6H .text CODE
0001:000108e6 0001000aH .textbss CODE
(略)
0004:00000268 000004f4H .idata$6 DATA
Address Publics by Value Rva+Base Lib:Object
0001:00000010 _WinMain@16 00401010 f Main.obj
(略)
0004:00000210 __imp__CloseHandle@4 0042a210 kernel32:KERNEL32.dll
0004:00000214 \177KERNEL32_NULL_THUNK_DATA 0042a214 kernel32:KERNEL32.dll
entry point at 0001:000000b0
『なんだかところどころ見たことのあるようなのが……』
「【_WinMain@16】とか、【@】が付いているのは Version 15.15 ( No.315 )
で説明したでしょ」
『あ! そうだ、エクスポートしたときの関数名がこんな感じだったね』
「そういうこと。このファイルを見ると、どんな関数が作られたのか、って
いうのが分かるから」
『……それだけ?』
「そう、それだけ」
/*
Preview Next Story!
*/
『やっとリンク編も終わった……』
「次はその他の設定について」
『? もしかして次回で DLL 編は最後?』
「それはまだないしょ」
『ないしょって……』
「というわけで次回」
< Version 15.26 「プロジェクトの設定」その他 >
『につづく!』
「意訳すると、まだ未定……」
『ああやっぱり……』