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
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 環境変数が存在しないフォルダを指定するようになってしまいます。
コンパイラの速度を速めるために、C++ API ヘッダ ファイルで前方宣言を使用することがよくあります。これによって、使用するオブジェクトすべてにヘッダ ファイルを含めないと、このエラーが発生する場合があります。
error C2027: use of undefined type 'Project'
c:¥Softimage¥Softimage_2013¥xsisdk¥include¥xsi_application.h(30) :
see declaration of 'Project'
error C2079: 'ppg' uses undefined class 'XSI::PPGLayout'
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
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'XSI::Model' (or there is no acceptable conversion)
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 はあいまい過ぎるため)。
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)
既定では、.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