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でシンボルのエクスポートを無効にするには
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 からのビルドは自動的にシンボルエクスポートを無効にします。シンボルをエクスポートするには、モジュール定義ファイルを提供するか、関数定義に __declspec(dllexport) キーワードを設定する必要があります。
より詳しい情報は、MicrosoftのVisual Studioドキュメントhttps://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll?view=msvc-160(以下抜粋)に記載されています。