5.10.4 UAPのコンパイルとリンケージ
UAPをコンパイルし,リンケージするために,Microsoft Visual C++のツールのnmakeコマンドを使います。ここでは,nmakeコマンドとともに使用できるmakefileの例を,作成する言語ごとに説明します。詳細については,各言語のマニュアルを参照してください。なお,サービス関数動的ローディング機能を使用してUAPを作成する場合は,「(5) サービス関数動的ローディング機能を使用する場合」を参照してください。
- 〈この項の構成〉
(1) SPPをC言語で作成する場合
(a) ソースファイル名
C言語で作成したUAPのソースプログラム名
-
メイン関数:exmain.c
-
サービス関数1:exsv1.c
-
サービス関数2:exsv2.c
-
RPCインタフェース定義ファイル名:ex.def
(b) メイクファイル
# TP1TEST Make File NODEBUG=1 !include <ntwin32.mak> SYSLIB = msvcrt.lib※ $(conlibsdll) TP1LIB = betran.lib RMLIB = RM.lib all:TP1TEST.exe #コンパイル exmain.obj:exmain.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv1.obj:exsv1.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv2.obj:exsv2.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c ex_sstb.obj:ex_sstb.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c #スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? # リンケージ TP1TEST.exe: exmain.obj exsv1.obj exsv2.obj ex_sstb.obj $(link) /NODEFAULTLIB $(conflags) $(linkdebug) /out:$*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \] [$(RMLIB)] $(TP1LIB) $(SYSLIB)
- (凡例)
-
- RM.libおよび[$(RMLIB)]
-
使用するリソースマネジャのライブラリ名を指定します。
- [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \]
-
OpenTP1下でリソースマネジャにアクセスするトランザクションを実行する場合だけ指定します。完全パス名で指定してください。
トランザクション制御用オブジェクトファイルは,[リソースマネジャ接続]アイコンで作成します。作成方法の詳細については,「2.1.3 リソースマネジャの接続」を参照してください。
- 注※
-
Visual Studio 2015以降を使用する場合は,必要に応じてucrt.libまたはvcruntime.libを追加してください。
(c) マニフェストファイルについて
Visual Studioで作成したプログラムを動作させる場合,マニフェストファイルが必要です。マニフェストファイルをメイクファイルに埋め込まない場合,プログラムを実行するフォルダにマニフェストファイルをコピーする必要があります。
(d) メイクファイル(マニフェストファイルを埋め込む場合)
# TP1TEST Make File NODEBUG=1 !include <ntwin32.mak> SYSLIB = msvcrt.lib※ $(conlibsdll) TP1LIB = betran.lib RMLIB = RM.lib all:TP1TEST.exe #コンパイル exmain.obj:exmain.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv1.obj:exsv1.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c exsv2.obj:exsv2.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c ex_sstb.obj:ex_sstb.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c #スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? # リンケージ TP1TEST.exe: exmain.obj exsv1.obj exsv2.obj ex_sstb.obj $(link) /NODEFAULTLIB $(conflags) $(linkdebug) /out:$*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \] [$(RMLIB)] $(TP1LIB) $(SYSLIB) mt -manifest $@.manifest -outputresource:$@;1
- (凡例)
-
- RM.libおよび[$(RMLIB)]
-
使用するリソースマネジャのライブラリ名を指定します。
- [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \]
-
OpenTP1下でリソースマネジャにアクセスするトランザクションを実行する場合だけ指定します。完全パス名で指定してください。
トランザクション制御用オブジェクトファイルは,[リソースマネジャ接続]アイコンで作成します。作成方法の詳細については,「2.1.3 リソースマネジャの接続」を参照してください。
- 注※
-
Visual Studio 2015以降を使用する場合は,必要に応じてucrt.libまたはvcruntime.libを追加してください。
(e) アプリケーションの配置について
Visual Studioで作成したアプリケーションをVisual Studioをインストールしていない環境で動作させる場合,Visual C++アプリケーションの実行に必要なMicrosoft Visual C++再頒布可能パッケージ(x86)をインストールする必要があります。詳細は,各Visual Studioのドキュメントを参照してください。
(2) SPPをCOBOL2002で作成する場合
(a) ソースファイル名
-
メインプログラム名:main.cbl
-
サービスプログラム名1:sev1.cbl
-
サービスプログラム名2:sev2.cbl
-
RPCインタフェース定義ファイル名:ex.def
(b) メイクファイル
# TP1TEST Make File NODEBUG=1 !include <ntwin32.mak> CBLFG1 = -Compile,NoLink -Lib,CUI -Comp5 -Main,System CBLFG2 = -Compile,NoLink -Lib,CUI -Comp5 TP1LIB = betran.lib RMLIB = RM.lib CCBL = ccbl2002 all:TP1TEST.exe # コンパイル main.obj:main.cbl $(CCBL) $(CBLFG1) main.cbl sev1.obj:sev1.cbl $(CCBL) $(CBLFG2) sev1.cbl sev2.obj:sev2.cbl $(CCBL) $(CBLFG2) sev2.cbl ex_sstb.obj:ex_sstb.c $(cc) $(cflags) $(cvarsdll) $(cdebug) $*.c # スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? # リンケージ TP1TEST.exe: main.obj sev1.obj sev2.obj ex_sstb.obj $(CCBL) -Lib,CUI -OutputFile $*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \] [$(RMLIB)] $(TP1LIB)
- (凡例)
-
- RM.libおよび[$(RMLIB)]
-
使用するリソースマネジャのライブラリ名を指定します。
- [$(DCDIR)\spool\trnrmcmd\userobj\オブジェクトファイル名 \]
-
OpenTP1下でリソースマネジャをアクセスするトランザクションを実行する場合だけ指定します。完全パス名で指定してください。
トランザクション制御用オブジェクトファイルは,[リソースマネジャ接続]アイコンで作成します。作成方法の詳細については,「2.1.3 リソースマネジャの接続」を参照してください。
- 注
-
Visual Studio 2015以降を使用する場合の詳細オプションについては,COBOL2002のマニュアルを参照ください。
(3) SPPをVisual Studioのプロジェクトで作成する場合
(a) プロジェクトの種類
プロジェクト作成時に指定するプロジェクトの種類は,Win32プロジェクトを指定してください。
(b) プロジェクトの設定
- プロジェクトを構成するファイル
-
プロジェクトを構成するソースファイルとして作成したアプリケーションのソース,およびスタブソースファイルを指定してください。
- CまたはMicrosoft Visual C++の設定
-
-
全般カテゴリで使用する追加のインクルードディレクトリとして,TP1/LiNKインストールフォルダ\includeを指定してください。
-
コード生成カテゴリで使用するランタイムライブラリとして,「マルチスレッド DLL(/MD)」を指定してください。
-
プリコンパイル済みヘッダーカテゴリで,「プリコンパイル済みヘッダーを使用しない」を選択してください。
-
- リンカの設定
-
-
全般カテゴリで使用する追加のライブラリディレクトリとして,TP1/LiNKインストールフォルダ\libを指定してください。
-
入力カテゴリで使用する追加する依存関係として,msvcrt.lib※ betran.libを指定してください。また,必要に応じて次に示す内容を指定してください。
- リソースマネジャのライブラリ
-
リソースマネジャを使用する場合だけ指定します。
- %DCDIR%\spool\trnrmcmd\userobj\トランザクション制御用オブジェクトファイル名
-
OpenTP1下でリソースマネジャをアクセスするトランザクションを実行する場合だけ指定します。完全パス名で指定してください。
トランザクション制御用オブジェクトファイルは,[リソースマネジャ接続]アイコンで作成します。作成方法の詳細については,「2.1.3 リソースマネジャの接続」を参照してください。
- 注※
-
Visual Studio 2015以降を使用する場合は,必要に応じてucrt.libまたはvcruntime.libを追加してください。
-
入力カテゴリの,すべての既定のライブラリの無視で,はい(/NODEFAULTLIB)を選択してください。
-
システムカテゴリのサブシステムとして,コンソール(/SUBSYSTEM:CONSOLE)を選択してください。
-
(4) SPPをCOBOL2002開発マネージャで作成する場合
(a) プロジェクトの設定の[リンク]タブ
「-Lib:CUI用の実行時ライブラリを使用する」を設定してください。
「ライブラリの指定」として,次に示す内容を指定してください。
-
リソースマネジャのライブラリ
リソースマネジャを使用する場合だけ指定します。
-
betran.lib
(b) プロジェクトの設定の[ユーザ設定]タブ
リンケージオプションとして,次に示す内容を追加してください。
-
Microsoft Visual C++で作成したスタブオブジェクトファイル名
-
%DCDIR%\spool\trnrmcmd\userobj\トランザクション制御用オブジェクトファイル名
OpenTP1下でリソースマネジャにアクセスするトランザクションを実行する場合だけ指定します。完全パス名で指定してください。
トランザクション制御用オブジェクトファイルは,[リソースマネジャ接続]アイコンで作成します。作成方法の詳細については,「2.1.3 リソースマネジャの接続」を参照してください。
(5) サービス関数動的ローディング機能を使用する場合
(a) メインプログラムの作成
dc_rpc_mainloop関数を含むメインプログラムを作成します。作成例については,製品に付属されているサンプルソース(メイクファイル)を参照してください。
(b) UAP共用ライブラリの作成
UAP共用ライブラリ中には,複数のサービス関数を含めることができます。UAP共用ライブラリに含まれる関数の中で,[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定するサービス関数については,必ずUAP共用ライブラリからエクスポートしてください。エクスポートされていないサービス関数がUAP共用ライブラリに存在していた場合,ユーザサーバ起動時(非常駐サーバの場合はプロセス起動時)にKFCA00344-Eメッセージが出力されて,dc_rpc_mainloop関数のDCRPCER_FATAL(-303)でエラーリターンします。[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定するサービス関数以外の関数についてのエクスポートは必須ではありませんので,処理形態に応じてエクスポートしてください。
UAP共用ライブラリから関数をエクスポートするには,LIBコマンドまたはLINKコマンドを使用する方法があります。次に示すどれかの方法でサービス関数をエクスポートしてください。
-
LIBコマンドまたはLINKコマンドで指定するオブジェクトファイル内で,__declspec(dllexport)を使用してサービス関数名を定義する。
-
LIBコマンドのオプションで,「/EXPORT:サービス関数名」を指定する。
-
LIBコマンドのオプションで,「/DEF:モジュール定義ファイル」を指定して,モジュール定義ファイル中にEXPORTS文形式でサービス関数を定義する。
サービス関数の作成例については,製品に付属されているサンプルソース(メイクファイル)を参照してください。
(c) UAP共用ライブラリを作成する場合の注意
[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定したUAP共用ライブラリ内でTLS(スレッドローカルストレージ)を使用した変数宣言をしないようにしてください。次のように,コーディングを含むUAPオブジェクトが,UAP共用ライブラリ内に存在する場合,該当の変数を参照するときにアクセス例外が発生します。
__declspec(Thread) int sample;
(d) サービス関数動的ローディング機能を使用する場合の注意事項
次に示す場合はサービス関数動的ローディング機能を使用できません。
-
MHPサーバ
-
SPP.NETサーバ
-
マネージドコードのUAP共用ライブラリ
マネージドコードのUAP共用ライブラリに含まれるサービス関数は,サービス関数動的ローディング機能で呼び出すことはできません。