Перенос кросс-платформенных библиотек С++ на платформу Windows Phone 8

Я много искал в Интернете и StackOverflow, но не могу найти окончательного ответа на мои следующие вопросы.

Контекст:

Я ищу для переноса группы вспомогательных библиотек С++ для использования с платформой Windows Phone 8 (WP8). Исторически эти библиотеки были созданы как статические библиотеки (а не библиотеки DLL).

Я успешно написал код, специфичный для WP8, так что библиотеки совместимы и строят против ARM, используя API, доступные для WP8 (с использованием документа WP API QuickStart в качестве ориентира). Только одна из библиотек (например, Lib1) требует использования расширений WinRT (флаг/ZW) из-за необходимости замены классических вызовов Win32 Thread на WinPT ThreadPool.

При создании Lib1 я получаю следующее предупреждение: Предупреждение 1 предупреждение LNK4264: архивирование файла объекта, скомпилированного с /ZW в статическую библиотеку; обратите внимание, что при создании Windows Runtime не рекомендуется связываться со статической библиотекой, содержащей метаданные Runtime Windows.

- в поисках этого предупреждения я нашел эту статью, заявив: "Если вы потребляете статическую библиотеку, которая создает общедоступные классы ref, классы общего интерфейса или классы общедоступных значений, компоновщик поднимает это предупреждение. Вы можете смело игнорировать предупреждение, если статическая библиотека не создает компоненты времени выполнения Windows, которые потребляются за пределами библиотеки Публичные компоненты в статической библиотеке будут компилироваться, но не будут активироваться во время выполнения. Любой компонент Runtime Windows, предназначенный для потребления другими компонентами или приложениями, должен быть реализован в библиотеке динамической компоновки (DLL)."

В Lib1 ClassA содержит функции, использующие вызовы WinPT ThreadPool. Функции ClassA вызывается ClassB, и они просто возвращают обычные HANDLE и DWORDs в ClassB.

Пример кода:

// ClassA.cpp
HANDLE WINAPI ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */)
{
    // Do WinRTThreadPool stuff to create WorkItem
    auto workItem = ref new Windows::System::Threading::WorkItemHandler([=](Windows::Foundation::IAsyncAction^)
    // More code that eventually results in a Win32 Handle

    return handle;
}

// ClassB.cpp
Handle handle = ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */);

Функции ClassA будут когда-либо вызываться ClassB из Lib1, а ClassB может использоваться приложением, связывающим Lib1.

Наконец, на мои вопросы:

  • Могут ли библиотеки С++ не использовать расширения WinRT (/ZW), при построении как статические библиотеки, могут использоваться приложениями Windows Phone 8?

  • Может ли библиотека С++ (Lib1) потреблять расширения WinRT (/ZW), созданный как статическая библиотека, может использоваться Windows Phone 8 приложений, несмотря на предупреждение?

  • Если ответ не соответствует ни одному из вопросов, мне нужно создать WinRT Компонентные обертки для всех классов в соответствующей библиотеке, как эта статья демонстрирует с помощью алгоритма Мандельброта? Или есть что-то еще, что мне не хватает?

Заранее благодарим за любой ввод, который вы можете предоставить.

Ответы

Ответ 1

Вопрос 1 Да, если вы не используете какие-либо API-интерфейсы, которые не разрешены на телефоне, например Win32, MFC и т.д. Некоторые из стандартных функций c имеют некоторые ограничения вокруг них; например, вы можете вызывать только fopen для файлов, находящихся в локальной области приложений. Конечно, вы можете получить доступ только к функциям вашего статического lib из кода на С++. Этот сценарий - это то, что мне нравится называть сценарием "Обычный Старый C++". Он отлично работает.

Вопрос 2 Да, если любые классы ref, которые вы определяете в этой статической lib, предназначены только для использования из этой статической библиотеки lib. Таким образом, в вашем примере, если класс A является обычным старым классом С++, вы будете в порядке. По сути, вы не можете иметь классы ref, которые являются общедоступными в том же смысле, что и общедоступные классы в сборке .NET, потому что для этого требуется некоторая магия COM-on-steroids и которая только компилируется в компоненты Windows Runtime. Если у вас есть простой старый код на С++, который обменивает ваши вызовы на любой код класса ref, а код, который потребляет ваш статический lib, потребляет его простым языком на С++, тогда вы в порядке. Логика предполагает, что вы не сможете передавать типы WinRT из статического lib, хотя я еще не тестировал это предположение.

Вопрос 3 Я считаю, что в статье, о которой вы ссылаетесь, не хватает того факта, что код в статической библиотеке lib может обращаться к классам ref и т.д., Поэтому не беспокойтесь, вам не нужно писать обертки компонентов Windows Runtime вокруг ваших статических библиотек. Вы только хотите сделать это, если хотите, чтобы код в вашей статической lib был доступен через "Public Classes" (в смысле сборки .NET).

Следует помнить, что вы все еще создаете статическую библиотеку "для магазина Windows". Это собственный код, но он все равно может использовать все материалы С++/CX, он просто не включает в себя средства активации COM, позволяющие доступным для него типам, доступным вне статически связанного сценария С++.