ビルドに関する一般的な問題

 
 
 

インクルード ファイルが見つからない

XSISDK_ROOT 環境変数が設定されていないと、次のようなエラー メッセージが表示されます。

Cannot find include file: <xsi_application.h>

または

c:¥users¥sblair¥My Workgroup¥Addons¥Test¥src¥TestCommand.cpp(7) : fatal error C1083: Cannot open include file: 'xsi_application.h': No such file or directory

解決方法

Windows の場合、Softimage コマンド プロンプトから Visual Studio を起動します。 Linux の場合、gmake を実行する前に .xsi_2013 リソース ファイルをソースに設定します。

ファイルを削除できない

Softimage にプラグインがロードされている場合、コンパイラでは既存の dll を削除できず、プラグインを再構築しようとすると次のエラーが表示されます。

MyCommand : error PRJ0008 : Could not delete file 'c:¥users¥sblair¥My Workgroup¥Application¥Plugins¥Debug¥MyCommand.dll'.

解決方法

コンパイル前にプラグインをアンロードします。

コンパイラの中間ファイルを開けない

このエラーは、Softimage コマンド プロンプトから Visual C++ を起動し、Softimage を終了してからプラグインを再構築しようとした場合に表示されることがあります。

c1xx : fatal error C1083: Cannot open compiler intermediate file: 'C:¥DOCUME~1¥tamu¥LOCALS~1¥Temp¥XSI_Temp_3092¥_CL_aaa02860ex': No such file or directory

Softimage が起動すると、TMP および TEMP 環境変数の値が変更されます。 これらの変更は、プラグイン マネージャから開いた Softimage コマンド プロンプトから Visual C++ を起動したときに、Visual C++ によって継承されます。 ところが、Softimage を終了すると、作成された一時フォルダが削除されるため、TMP および TEMP 環境変数が存在しないフォルダを指定するようになってしまいます。

解決方法

Visual C++ を終了して再起動してから、プラグインを再構築します。

未定義タイプ

コンパイラの速度を速めるために、C++ API ヘッダ ファイルで前方宣言を使用することがよくあります。これによって、使用するオブジェクトすべてにヘッダ ファイルを含めないと、このエラーが発生する場合があります。

エラーの例 1

error C2027: use of undefined type 'Project'
c:¥Softimage¥Softimage_2013¥xsisdk¥include¥xsi_application.h(30) :
see declaration of 'Project'

エラーの例 2

error C2079: 'ppg' uses undefined class 'XSI::PPGLayout'

エラーの例 3

error C2664: 'XSI::CustomOperator::AddIOPort' : cannot convert parameter 1  
from 'XSI::Primitive' to 'const XSI::CRef &'
		Reason: cannot convert from 'XSI::Primitive' to 'const XSI::CRef'
		Source or target has incomplete type

エラーの例 4

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'XSI::Model' 
(or there is no acceptable conversion)

解決方法

必要なヘッダ ファイルがすべて含まれていることを確認します。 ヘッダ ファイルの命名規則により、各ヘッダがどのヘッダ ファイルに含まれているかが分かりやすくなっています。

ヒント:

必要な場合は、多くの一般的な Softimage ヘッダ ファイルを含む独自のヘッダ ファイルを作成することもできます。

次の表に、上述したエラーの例を解決するための推奨方法を示します。

解決すべきエラー

使用するディレクティブ

エラーの例 1

include <xsi_project.h>

エラーの例 2

include <xsi_ppglayout.h>

エラーの例 3

include <xsi_primitive.h>

エラーの例 4

include <xsi_model.h>

変換できない

CValue は、多くのデータ型(Softimage オブジェクトなど)を保存できる汎用データ型です。つまり、スクリプティングから移行されるコードや cmdstubs ユーティリティによって生成されるコードでは、CValue を使用して引数を表すことがよくあります。

たとえば以下のようになります。

void DoSomething( const CValue & in_XSIRef )
{
  //... stuff happens...
}

ここで、X3DObject などの Softimage オブジェクトをこの関数に渡すケースを想定します。

X3DObject someObj ;

// Won't compile: 
DoSomething( someObj ) ;

これはコンパイラのエラーです。

error C2664: 'DoSomething' : cannot convert parameter 1 from 'XSI::X3DObject' to 'const XSI::CValue &'Reason: No constructor could take the source type, or constructor overload resolution was ambiguous

解決方法

CValue は、Softimage オブジェクトを CRef で表します。すべての Softimage オブジェクトは CRef として表すことができますが、Softimage オブジェクトは直接 CRef から派生するものではないため、真の CRef オブジェクトではありません。ただし、キャスト オペレータや CBase::GetRef ()関数を使用することによって、Softimage オブジェクトを簡単に CRef に変えることができます。さらに、コンストラクタオペレータや割り当てオペレータを使用して、CRef を CValue に変えることもできます。これら 2 つの操作を行うことで、X3DObject から CValue をビルドできます。

実際には、Softimage オブジェクトを CValue に変換する複数の方法でコンパイラに問題が発生します。次のように、X3DObject を CRef に変換する具体的な方法に関するヒントをコンパイラに与えることが問題の解決につながります。

DoSomething( CValue( someObj ) ) ;

または

DoSomething( someObj.GetRef() ) ;

または

DoSomething( (CRef&)someObj ) ;

明確さを増すために、一時的な変数を使用することもできます。 これによって、実際に呼び出される関数とコンストラクタが示されます。

// This is just one of several options
 CRef& ref = someObj.GetRef() ;
 CValue val( ref ) ;
 DoSomething( val ) ;

代わりに、予測するオブジェクト タイプをもっとはっきりさせるように関数を変更することもできます(CValue はあいまい過ぎるため)。

  • 関数が X3DObjects にしか作用しない場合は、その点がシグネチャから明確に分かるようにする必要があります。

    void DoSomething( const X3DObject & in_XSIRef )
    {
    	//... stuff happens...
    }
  • また、関数がどの Softimage オブジェクトにも作用する場合は、CBase または SIObject を使用することができます。

    void DoSomething( const SIObject & in_XSIRef )
    {
    	//... stuff happens...
    }
    
注:

CValue、CRef、CBase の間の変換は迅速で、CRef と CBase はサイズの軽いオブジェクトであるため、通常ではパフォーマンスに大きな問題が発生することは考えられません。 ただし、ループのきついコードやパフォーマンスが重要なコード内では、CValue ではなく明確な型を使用する方が適切な場合もあります。

未解決の外部シンボル

C++ API で未解決のシンボルに関連するすべてのリンカ エラーの原因としては、sicppsdk.lib(または古いバージョン)にリンクしていないことが考えられます。

error LNK2001: unresolved external symbol "__declspec(dllimport) public: 
	class XSI::CRefArray __thiscall XSI::Operator::GetInputPorts(void)const " 
	(__imp_?GetInputPorts@Operator@XSI@@QBE?AVCRefArray@2@XZ)

error LNK2001: unresolved external symbol "__declspec(dllimport) public: 
	__thiscall XSI::MATH::CRotation::~CRotation(void)" 
	(__imp_??1CRotation@MATH@XSI@@QAE@XZ)

同様に、定数が欠けていることに関連する未解決の外部シンボルがある場合は、sicoresdk.lib(または古いバージョン)にリンクしていないことが原因である可能性があります。

error LNK2001: unresolved external symbol "__declspec(dllimport) unsigned short const * const XSI::siControlCombo" 
(__imp_?siControlCombo@XSI@@3PBGB)

解決方法

すべての C++ API dll で常に sicoresdk.lib および sicppsdk.lib にリンクし、Softimage をインストールした正しい場所を指定するように環境を設定していることを確認します。

モジュールのマシンタイプ 'x86' がターゲットのマシンタイプ 'x64' と競合する

既定では、.Net 2010 は 64 ビット環境でコンパイルを行います。そのため、32 ビット環境で作業する場合、リンカによってエラーが発生します(リンカ ツール エラー LNK1112)。

fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64
'<user_home>¥Application¥Plugins¥Debugx64¥TestComponentSelection.obj

解決方法

既定の[Active solution configuration(アクティブ ソリューション構成)]設定を[Debug x64(デバッグ x64)]または[Release x64(リリース x64)]から[デバッグ]または[リリース]に変更します。

  1. ソリューションを開いておき、[ビルド](Build)メニューから[構成マネージャ](Configuration Manager)を選択します。

  2. [アクティブ ソリューション構成](Active solution configuration)ドロップダウン リストの値が[Debug x64(デバッグ x64)]または[Release x64(リリース x64)]で、32 ビット環境でコンパイルを行う場合、リストから[デバッグ]または[リリース]を選択して[閉じる](Close)をクリックします。