Exporting Symbols in Effects — After Effects SDK Guide 22.0.0 documentation

After Effectsチームは、最近、C++言語のOne Definition Rule(ODR)に違反するシンボルが競合する問題を認識しました。

2021年初頭、After Effectsで使用されているBoostライブラリのバージョンが1.74にアップグレードされました。ここ数ヶ月の間に、Boost を使用しているにもかかわらず、After Effects またはプラグインが不正なバージョンの Boost を呼び出してしまい、ユーザーがハングアップしたりクラッシュしたりするような方法でシンボルをエクスポートしているプラグインを多数確認しました。また、AE SDK のサンプルの多くが、デフォルトですべてのシンボルをエクスポートするように設定されており、他のプラグインの開始点として使用されていると仮定すると、この問題の一因になっている可能性があることも確認しました。これらは、2021年3月のSDKの一部として修正されています。

After Effectsで書き出しが必要な記号は、プラグインのエントリーポイントのみです。

サンプルはSDKサンプルのentry.hに記載されています。

#ifdef AE_OS_WIN
#define DllExport   __declspec( dllexport )
#elif defined AE_OS_MAC
#define DllExport   __attribute__ ((visibility ("default")))
#endif

というように、エントリーポイント関数に適用されます。

extern "C" DllExport
PF_Err PluginDataEntryFunction(
PF_PluginDataPtr inPtr,
PF_PluginDataCB inPluginDataCallBackPtr,
SPBasicSuite* inSPBasicSuitePtr,
const char* inHostName,
const char* inHostVersion)
{
	PF_Err result = PF_Err_INVALID_CALLBACK;
	result = PF_REGISTER_EFFECT(
		inPtr,
		inPluginDataCallBackPtr,
		"ColorGrid", // Name
		"ADBE ColorGrid", // Match Name
		"Sample Plug-ins", // Category
		AE_RESERVED_INFO
	); // Reserved Info
	return result;
}

Xcode Symbol Exportを無効にする

Xcodeでシンボルのエクスポートを無効にするには

  1. プロジェクトのBuild settingsで、Apple Clang - Code Generationのセクションを探します。
  2. Symbols Hidden By DefaultをYESに設定します。

https://lh4.googleusercontent.com/zMkENeHBp5rkgwhfy2XH_hjsw2D5aShaVNJziHd0QUPaEt4LWNkyAqDY3oQ3-EWKpiWJPsu4Ja13-azfz9LpsyheB7Cz2mfLVxwd6Avt8qZHS_D4yg0jH9uBAo3m7O259w=w1280

または公開しなければならない特定のシンボルがある場合は、コード内で__attribute__((visibility("default"))) を使用します。

詳細は、AppleのXcodeドキュメント https://help.apple.com/xcode/mac/11.4/#/itcaec37c2a6 (以下抜粋)に記載されています。

Symbols Hidden by Default (GCC_SYMBOLS_PRIVATE_EXTERN) When enabled, all symbols are declared private extern unless explicitly marked to be exported using attribute((visibility("default"))) in code. If not enabled, all symbols are exported unless explicitly marked as private extern.

Visual Studioエクスポートを無効にする

デフォルトでは、Visual Studio からのビルドは自動的にシンボルエクスポートを無効にします。シンボルをエクスポートするには、モジュール定義ファイルを提供するか、関数定義に __declspec(dllexport) キーワードを設定する必要があります。

より詳しい情報は、MicrosoftのVisual Studioドキュメントhttps://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll?view=msvc-160(以下抜粋)に記載されています。