Компилятор для dll именно микрософт, но я наверно неточно выразился: проблема не в самом экспорте, а в том, как сделать его эффективным и переносимым.
С точки зрения внешней программы работа с dll должна заключаться в создании объектов и вызове для них методов. Сама управляющая программа может не быть объектно ориентированной. Одно из удобных решений - создавать и удалять объекты с помощью вызовов функций dll, а при вызове методов передавать адрес экземпляра объекта (хэндлер) в качестве первого параметра. Так сделано в API виндов, в частности при работе с GDI.
Очевидно, что при этом для каждого метода нужно сделать экспортируемую обертку типа:
Код
__declspec(dllexport)
MyMethod( HOBJECT instance, ...параметры... )
{
((MyClass*)instance)->MyMethod( ...параметры... );
}
Проблема в том, как сделать, чтобы метод класса при этом встраивался (inline) в эту функцию, но не встраивался во внутренние функции библиотеки. Пробовал разные варианты, в результате получилось, что метод встраивается только если его определить прямо в объявлении класса в хеадере, но при этом он встраивается везде, и вообще решение не самое изящное. Еще пробовал с атрибутом __forceinline, - во внешние вызовы не встраивается.
Можно конечно отказаться от использования классов внутри dll, но тогда в коде будет много лишнего.