Сборка динамически загружаемых библиотек в MSVC имеет существенное отличие от сборки таковых на gcc и clang. Данное отличие заключается в том, что в MSVC требуется вручную маркировать каждый экспортируемый символ при помощи declspec() в исходном тексте либо писать и поддерживать DEF-файл, что в случае C++ не так-то просто. Данное обстоятельство может доставить проблем в случае портирования крупного проекта с других платформ.
DEF-файл можно сгенерировать, проанализировав вывод dumpbin /symbols, и, соответственно, написать свою утилиту. Но зачем это делать, если это сделал уже кто-то другой? В интернетах встречаются perl-скрипты для решения этой проблемы, но я к перлу отношусь с подозрением, и дальнейшие поиски привели меня к такому решению:
cmake.exe -E __create_def MyDLL.def objects.txt
где objects.txt это текстовый файл со списком obj-файлов проекта.
cmake в этом качестве можно использовать как самостоятельную утилиту, перевод проекта на cmake не требуется.
Впрочем, при переводе проекта на cmake данная функциональность также легко доступна внутри cmake-скрипта через WINDOWS_EXPORT_ALL_SYMBOLS.