35.1.2 コンパイルとリンクを別々に実行する方法
COBOLプログラムが複数ある場合,あらかじめccbl2002コマンドでオブジェクトファイルを作成しておき,そのあとccbl2002コマンドやLINKコマンドでオブジェクトファイルをリンクして実行可能ファイルを生成できます。
(1) ccbl2002コマンドによるリンク方法
ccbl2002コマンドでコンパイルとリンクを別々に実行する方法を,次に示します。
- ccbl2002コマンドの指定
-
まず,COBOLプログラム"test01.cbl"および"test02.cbl"をコンパイルし,オブジェクトファイルを生成します。コンパイルだけを実行し,リンクを実行しない場合は,ccbl2002コマンドに-Compile,NoLinkオプションを指定します。
ccbl2002 -Main,System test01.cbl -Compile,NoLink ccbl2002 test02.cbl -Compile,NoLink
次に,生成された"test01.obj"および"test02.obj"をccbl2002コマンドを使用してリンクします。
ccbl2002 test01.obj test02.obj -OutputFile test03.exe
上記のコマンドを実行すると,実行可能ファイル"test03.exe"が生成されます。
(2) LINKコマンドによるリンク方法
ccbl2002コマンドでCOBOLプログラムからCOBOLオブジェクトファイルを生成したあと,リンカを使用することで実行可能ファイルを作成できます。
リンクの方法を以下に示します。
-
LINKコマンドを実行する。
-
次にマニフェストを埋め込む。
リンカについては,「38.1 リンカ」を参照してください。LINKコマンドの実行については,「35.1.2 コンパイルとリンクを別々に実行する方法」の「(2) LINKコマンドによるリンク方法」の「(a) LINKコマンドの指定」を参照してください。
マニフェストの埋め込みについては,「35.1.2 コンパイルとリンクを別々に実行する方法」の「(2) LINKコマンドによるリンク方法」の「(b) マニフェストの埋め込み方法」を参照してください。
(a) LINKコマンドの指定
リンカを使用して,COBOLプログラムを含む実行可能ファイルおよびDLLを作成するときは,リンカの引数に次のライブラリを指定する必要があります。
-
-
GUIモードの実行可能ファイルを作成する場合
cbl2k_32.lib
cbl2klg.lib
msvcrt.lib
kernel32.lib
vcruntime.lib
ucrt.lib
-
CUIモードの実行可能ファイルを作成する場合
cbl2k_32.lib
cbl2klc.lib
msvcrt.lib
kernel32.lib
vcruntime.lib
ucrt.lib
-
DLLを作成する場合
cbl2k_32.lib
cbl2kdl.lib
msvcrt.lib
kernel32.lib
vcruntime.lib
ucrt.lib
-
-
使用する機能によって必要となるライブラリ
COBOLプログラムで使用する機能によって,リンク時に,関連するライブラリを指定する必要があります。
使用する機能とライブラリについては,「35.1.1 コンパイルとリンクを同時に実行する方法」の「(4) COBOLプログラムと標準ライブラリをリンクして実行可能ファイルを生成する」を参照してください。
-
LINKコマンドに指定する引数
LINKコマンドに必要なパラメタを指定する場合,次のパラメタは必ず指定しなければなりません。
-
GUIモードの実行可能ファイルを作成の場合
/ENTRY:WinMainCRTStartup
/NODEFAULTLIB
-
CUIモードの実行可能ファイルを作成の場合
/ENTRY:mainCRTStartup
/NODEFAULTLIB
-
DLLを作成の場合(Windows(x86) COBOL2002の場合)
/ENTRY:_DllMainCRTStartup@12
/NODEFAULTLIB
-
DLLを作成の場合(Windows(x64) COBOL2002の場合)
/ENTRY:_DllMainCRTStartup
/SUBSYSTEM:{CONSOLE|WINDOWS}
/NODEFAULTLIB
LINKコマンドの引数には,/NODEFAULTLIBを指定してください。
これによる,次に示す/DEFAULTLIBオプションの扱いについて説明します。
-
/DEFAULTLIB:kernel32.lib
-
/DEFAULTLIB:uuid.lib
-
/DEFAULTLIB:MSVCRT
-
/DEFAULTLIB:OLDNAMES
kernel32.libがライブラリの検索対象から除外されますが,kernel32.libは明示的にリンクされるので,リンケージの結果に影響はありません。
/NODEFAULTLIB:oldnames.libを指定した場合,oldnames.libの指定(/DEFAULTLIB:oldnames.lib)だけが無効になります。kernel32.lib,uuid.lib,およびmsvcrt.libは,COBOL2002の環境に含まれるため,リンケージは正常に終了します。
COBOL2002では,LINKコマンド(LINK.exe)の実行時のパラメタを取得しません。/VERBOSEオプションを指定すると,リンカの進行状況を確認できます。
-
-
使用例
上記の場合,次の手順で実行可能ファイルを作成します。
-
ccbl2002コマンドで,test01.cblからtest01.objを生成します。
ccbl2002 -Compile,NoLink -Main,System test01.cbl
-
Cコンパイラで,test02.cからtest02.objを生成します。
-
リンカで,GUIモードの実行可能ファイルを生成します。
LINK TEST01.obj TEST02.obj cbl2k_32.lib cbl2klg.lib
/out:TEST01.exe
/ENTRY:WinMainCRTStartup
msvcrt.lib kernel32.lib
vcruntime.lib ucrt.lib
-
(b) マニフェストの埋め込み方法
LINKコマンドを実行すると,使用するC実行時ライブラリのバージョンやリンカオプションの指定によって,実行可能ファイル(.exe),またはDLLファイル(.dll)のほかにマニフェストファイル(.manifest)が生成されることがあります。マニフェストファイルには,使用するC実行時ライブラリの情報やUAC情報などが登録されていて,プログラムを実行する場合に必要です。
生成されたマニフェストファイルの情報(マニフェスト)は,MTコマンドを使用して,対応する実行可能ファイル,またはDLLファイル中に埋め込んで使用してください。埋め込まれていない場合,プログラム実行時にC実行時ライブラリのローディングエラーになることがあります。
MTコマンドの使用例を以下に示します。
-
MTコマンドに指定するパラメタ
MTコマンドを使用してマニフェストを埋め込む場合,以下のパラメタを指定します。
-manifest マニフェストファイル名 -outputresource:出力ファイル名[;[#]リソースID]
- 出力ファイル名
-
実行可能ファイル名,またはDLLファイル名を指定します。
- リソースID
-
リソースが実行可能ファイルの場合:1
リソースがDLLファイルの場合:2
なお,リソースIDの指定を省略した場合は1が仮定されます。
-
MTコマンドの使用例
-
実行可能ファイルの場合
LINKコマンドを使用して実行可能ファイルTEST01.exeを生成した場合,マニフェストファイルTEST01.exe.manifestが生成されます。TEST01.exe中にマニフェストを埋め込む場合のコマンド例を,以下に示します。
MT -manifest TEST01.exe.manifest -outputresource:TEST01.exe;#1
-
DLLファイルの場合
LINKコマンドを使用してDLLファイルDLLSUB.dllを生成した場合,マニフェストファイルDLLSUB.dll.manifestが生成されます。DLLSUB.dll中にマニフェストを埋め込む場合のコマンド例を,以下に示します。
MT -manifest DLLSUB.dll.manifest -outputresource:DLLSUB.dll;#2
-