Во-первых, он должен находиться в динамической библиотеке, а не в статической (если вы не будете перекомпилировать сам Perl и связывать его со своей статической библиотекой).
Во-вторых, поскольку C ++ будет искажать имена (одна из самых раздражающих «особенностей» C ++, если вы спросите меня), вам понадобится внешний блок «C», который содержит функции перехвата. Если бы вы использовали C ++, вы, вероятно, могли бы обойтись с помощью единственной функции-ловушки, которая возвращает объект C ++, который реализует интерфейс, который вам нужно использовать. Поскольку вы используете Perl, вам может понадобиться обернуть объект в интерфейс, подобный этому:
CPPObject object;
extern "C"
{
int InitObject( void )
{
return object.init();
}
int DoCoolStuff( void )
{
return object.DoCoolStuff();
}
int DoOtherCoolStuff( int foo )
{
return object.DoOtherCoolStuff( foo );
}
int DestroyObject( void )
{
return object.Destroy();
}
}