#pragma twice

KAB-studio > プログラミング > #pragma twice > 325 Version 15.25 「プロジェクトの設定」リンク編(2)

#pragma twice 325 Version 15.25 「プロジェクトの設定」リンク編(2)

前のページへ 表紙・目次へ 次のページへ

 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 「プロジェクトの設定」その他 >
『につづく!』
「意訳すると、まだ未定……」
『ああやっぱり……』
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。