Как стать автором
Обновить

Комментарии 11

Данное свойство автоматически создает module definition (.def) со всеми глобальными символами из .obj файла для динамической библиотеки на ОС Windows.

О!!! Спасибо! А то мне сейчас приходится юзать перловый скрипт который создаёт этот .def. Но увы пока приходится использовать 4.3 т.к. в 4.4 отломали MSVC2015.
С данным флагом не сталкивался, на досуге почитаю и применю в некоторых проектах
Этот макрос из разряда "must use" в связке библиотеки и cmake. Он генерирует в папке билда файл с определением макросов экспорта символов, учитывая сборку в статику (оставляет пустыми) и динамику (__declspec(..)), а также макросы deprecated для маркировки старых функций.
В простейшем случае достаточно написать:

generate_export_header(mylib)

и использовать сгенерированный файл

#include "mylib_export.h"
class MYLIB_EXPORT MyClass 
{
};

Более тонкая настройка позволяет указать необходимое имя генерируемого файла, макросов и прочего.
Замечательное свойство, теперь можно удалять этот мусор из заголовков.

Дополню: чтобы экспортировать только символы из определённого target'a, можно написать
set_target_properties(таргет1 таргет2 PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
И вероятность появления ошибки во время неправильного написания блока условной компиляции и определения макроса среди разработчиков сведена к нулю
Просто надо использовать cmake-функцию generate_export_header, тогда человеческий фактор исключается.
```
include(GenerateExportHeader)

generate_export_header(MyLib
EXPORT_FILE_NAME MyLibExport.h
EXPORT_MACRO_NAME MyLib_EXPORT
NO_EXPORT_MACRO_NAME MyLib_HIDDEN
STATIC_DEFINE MyLib_STATIC
)
```

Не знаю, что такое случилось с тегом source, но код нормально не вставляется
Не знаю, что такое случилось с тегом source, но код нормально не вставляется

Каким бы странным это не казалось, но теги и код должны быть на разных строчках.
Как говорится дело вкуса, но есть одно но:
данный метод требует добавление нескольких строчек кода, но и сам код будет выглядит не естественным образом.

Предложенный метод позволяет разработчику видеть код, что на Windows и Linux одинаковым способом без макроса EXPORT.

и в cmake-листе всего одна строка, а не шесть.
Со сгенерированным заголовочным файлом экспорта код тоже выглядит одинаково на всех поддерживаемых платформах.

А если не нужно экспортировать все символы? Способ с generate_export_header позволяет это сделать (NO_EXPORT_MACRO_NAME). Код в любом случае будет выглядеть одинаково и, я не вижу, что есть неестественного в подобном коде:

#include "MyLibExport.h"

class MyLib_EXPORT MyClass
{
};

MyLib_HIDDEN void MyHiddenFunction();

Причем это совершенно не мешает при статической линковке, так как сгенерированный файл экспорта учитывает, что библиотека может быть как SHARED, так и STATIC.

Естественно, что при этом и новая переменная WINDOWS_EXPORT_ALL_SYMBOLS имеет полное право на жизнь. :)
Во-первых, при чем здесь __linux__?

Во-вторых, экспорт всех символов подряд несет за собой негативные последствия, почему вы о них умолчали?
  1. для настройки экспорта классов в ОС Windows.
  2. Показан новый принцип экспорта на ОС Windows, т.к. на ОС Linux экспортируется все по умолчанию.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.