Я много искал в Интернете и 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 Компонентные обертки для всех классов в соответствующей библиотеке, как эта статья демонстрирует с помощью алгоритма Мандельброта? Или есть что-то еще, что мне не хватает?
Заранее благодарим за любой ввод, который вы можете предоставить.