5.10.4 UAPのコンパイルとリンケージ

UAPをコンパイルし,リンケージするために,Microsoft Visual C++のツールのnmakeコマンドを使います。ここでは,nmakeコマンドとともに使用できるmakefileの例を,作成する言語ごとに説明します。詳細については,各言語のマニュアルを参照してください。なお,サービス関数動的ローディング機能を使用してUAPを作成する場合は,「(5) サービス関数動的ローディング機能を使用する場合」を参照してください。

<この項の構成>
(1) SPPをC言語で作成する場合
(2) SPPをCOBOL2002で作成する場合
(3) SPPをVisual Studioのプロジェクトで作成する場合
(4) SPPをCOBOL2002開発マネージャで作成する場合
(5) サービス関数動的ローディング機能を使用する場合

(1) SPPをC言語で作成する場合

(a) ソースファイル名

C言語で作成したUAPのソースプログラム名

(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 リソースマネジャの接続」を参照してください。
ntwin32.makについて
Visual Studio 2012では,標準コンパイルオプション定義マクロであるntwin32.makは配布されません。
(c) マニフェストファイルについて

Visual Studioで作成したプログラムを動作させる場合,マニフェストファイルが必要です。マニフェストファイルをメイクファイルに埋め込まない場合,プログラムを実行するフォルダにマニフェストファイルをコピーする必要があります。

なお,Visual Studio 2010またはVisual Studio 2012を使用してプログラムを作成している場合,マニフェストが作成されないことがあります。この場合は,マニフェストファイルは必須ではありません。

(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 リソースマネジャの接続」を参照してください。
ntwin32.makについて
Visual Studio 2012では,標準コンパイルオプション定義マクロであるntwin32.makは配布されません。
(e) アプリケーションの配置について

Visual Studioで作成したアプリケーションをVisual Studioをインストールしていない環境で動作させる場合,Visual C++アプリケーションの実行に必要なMicrosoft Visual C++再頒布可能パッケージ(x86)をインストールする必要があります。詳細は,各Visual Studioのドキュメントを参照してください。

(2) SPPをCOBOL2002で作成する場合

(a) ソースファイル名
(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 リソースマネジャの接続」を参照してください。
ntwin32.makについて
Visual Studio 2012では,標準コンパイルオプション定義マクロであるntwin32.makは配布されません。

(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 リソースマネジャの接続」を参照してください。
  • 入力カテゴリの,すべての既定のライブラリの無視で,はい(/NODEFAULTLIB)を選択してください。
  • システムカテゴリのサブシステムとして,コンソール(/SUBSYSTEM:CONSOLE)を選択してください。

(4) SPPをCOBOL2002開発マネージャで作成する場合

(a) プロジェクトの設定の[リンク]タブ

「-Lib:CUI用の実行時ライブラリを使用する」を設定してください。

「ライブラリの指定」として,次に示す内容を指定してください。

(b) プロジェクトの設定の[ユーザ設定]タブ

リンケージオプションとして,次に示す内容を追加してください。

(5) サービス関数動的ローディング機能を使用する場合

(a) メインプログラムの作成

dc_rpc_mainloop関数を含むメインプログラムを作成します。作成例については,製品に付属されているサンプルソース(メイクファイル)を参照してください。

(b) UAP共用ライブラリの作成

UAP共用ライブラリ中には,複数のサービス関数を含めることができます。UAP共用ライブラリに含まれる関数の中で,[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定するサービス関数については,必ずUAP共用ライブラリからエクスポートしてください。エクスポートされていないサービス関数がUAP共用ライブラリに存在していた場合,ユーザサーバ起動時(非常駐サーバの場合はプロセス起動時)にKFCA00344-Eメッセージが出力されて,dc_rpc_mainloop関数のDCRPCER_FATAL(-303)でエラーリターンします。[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定するサービス関数以外の関数についてのエクスポートは必須ではありませんので,処理形態に応じてエクスポートしてください。

UAP共用ライブラリから関数をエクスポートするには,LIBコマンドまたはLINKコマンドを使用する方法があります。次に示すどれかの方法でサービス関数をエクスポートしてください。

サービス関数の作成例については,製品に付属されているサンプルソース(メイクファイル)を参照してください。

(c) UAP共用ライブラリを作成する場合の注意

[SPP環境設定]ダイアログボックスの[登録するサービス]欄で指定したUAP共用ライブラリ内でTLS(スレッドローカルストレージ)を使用した変数宣言をしないようにしてください。次のように,コーディングを含むUAPオブジェクトが,UAP共用ライブラリ内に存在する場合,該当の変数を参照するときにアクセス例外が発生します。

__declspec(Thread) int sample;

(d) サービス関数動的ローディング機能を使用する場合の注意事項

次に示す場合はサービス関数動的ローディング機能を使用できません。