Виндос экспорт / импорт символов под MinGW против MSVS; WINDOWS_EXPORT_ALL_SYMBOLS CMake игнорируется - PullRequest
3 голосов
/ 21 января 2020

Чтобы создать библиотеку C с Visual Studio, команда CMake

set(WINDOWS_EXPORT_ALL_SYMBOLS ON)

избавляет меня от добавления __declspec(dllexport) или __declspec(dllimport) перед объявлениями функций; явные символы импорта / экспорта требуются только для глобальных переменных.

Под MinGW (читай: либо MinGW, либо его рекомендуемая замена Mingw-w64) это не работает. Не удалось связать приложения (также созданные с MinGW) с моей библиотекой, пока я не вставил символы импорта / экспорта перед каждой функцией. В то время как длинный ответ { ссылка } говорит об обратном: нет необходимости импортировать / экспортировать символы в MinGW. Это правильный ответ? Как тогда избавиться от необходимости импорта / экспорта символов?

1 Ответ

1 голос
/ 01 апреля 2020

Я только что столкнулся с той же проблемой. После просмотра исходного кода CMake, исправление, которое работало для меня, было также добавить:

set( CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS 1 )

CMake говорит :

Это свойство реализовано только для MS-совместимых инструментов на Windows.

CMake включает эту возможность, устанавливая CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS в каждом файле «Платформа» в <cmake install>/Modules/Platform, который, как они знают, поддерживает это. Тем не менее, CMake не моделирует MinGW как «платформу». Вместо этого вы просто выбираете "Windows Makefile", "Windows Ninja" и др. c. и вручную установите компиляторы C / C ++ / Fortran, чтобы они указывали на компиляторы MinGW g cc. В идеале CMake должен распознавать, когда ОС Windows, а компилятор g cc, и установить это для нас, но сейчас мы можем помочь, настроив его самостоятельно.

Кстати, CMake реализует эту функцию с помощью скрытая команда cmake -E __create_def <output-def> <input-list-of-obj-files>. Ранее я думал о добавлении пользовательского правила для запуска этой команды. Хотя он начинается с __, он предназначен для внутреннего использования и может меняться от одного выпуска к другому.

...