15

Ich habe das Web und StackOverflow häufig durchsucht, aber ich kann keine definitive Antwort auf meine folgenden Fragen finden.Portierung plattformübergreifender C++ - Bibliotheken auf Windows Phone 8-Plattform

Kontext:

Ich bin auf der Suche nach Port eine Gruppe von C++ Hilfsbibliotheken für die Verwendung mit dem Windows Phone 8 (WP8) -Plattform. In der Vergangenheit wurden diese Bibliotheken als statische Bibliotheken (anstelle von DLLs) erstellt.

Ich habe erfolgreich den WP8-spezifischen Code geschrieben, so dass die Bibliotheken kompatibel sind und gegen ARM aufbauen, unter Verwendung der für WP8 verfügbaren APIs (unter Verwendung des WP API QuickStart doc als Referenzpunkt). Nur eine der Bibliotheken (z. B. Lib1) benötigt den Verbrauch der WinRT-Erweiterungen (das/ZW-Flag), da die klassischen Win32-Thread-Aufrufe durch den ThreadPool von WinRT ersetzt werden müssen.

Beim Aufbau von Lib1 erhalte ich folgende Warnung: Warnung 1 Warnung LNK4264: Archivierung der Objektdatei mit/ZW in eine statische Bibliothek übersetzt; Beachten Sie, dass beim Erstellen von Windows-Runtime-Typen die Verknüpfung mit einer statischen Bibliothek, die Windows-Laufzeitmetadaten enthält, nicht empfohlen wird.

- für diese Warnung der Suche, fand ich this article, die besagt: „Wenn Sie eine statische Bibliothek verbrauchen, die öffentliche ref Klassen erstellt, die öffentliche Schnittstelle Klassen oder öffentliche Wertklassen, der Linker diese Warnung wirft Sie die ignorieren. Warnung, wenn die statische Bibliothek keine Windows-Runtime-Komponenten erzeugt, die außerhalb der Bibliothek selbst verwendet werden Öffentliche Komponenten in einer statischen Bibliothek werden zur Laufzeit kompiliert, werden jedoch nicht aktiviert Jede Windows-Runtime-Komponente, die von anderen Komponenten oder Apps verwendet werden soll implementiert in einer Dynamic Link Library (DLL). "

In Lib1 enthält ClassA die Funktionen, die WinRT ThreadPool-Aufrufe verwenden. ClassA-Funktionen werden von ClassB aufgerufen, und sie geben einfach reguläre HANDLEs und DWORDs an ClassB zurück.

Code-Beispiel:

// 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 */); 

KlasseA Funktionen werden immer nur von ClassB genannt werden, aus Lib1 und ClassB kann dann durch die Anwendung verwendet werden, die Verknüpfung Lib1.

schließlich auf meine Fragen:

  1. Kann die C++ Bibliotheken, die tun nicht WinRT Erweiterungen (/ ZW) verbrauchen, , wenn sie als statische Bibliotheken gebaut, die von Windows Phone 8-Anwendungen verwendet werden, ?

  2. Kann die C++ Bibliothek (Lib1), dass verbraucht WinRT Erweiterungen (/ ZW), wenn sie als eine statische Bibliothek gebaut, die von Windows Phone 8 Anwendungen verwendet werden, trotz der Warnung?

  3. Wenn die Antwort Nein zu jeder Frage ist, werde ich zu WinRT Component Wrapper für alle Klassen in der jeweiligen Bibliothek erstellen, wie this article demonstriert mit dem Mandelbrot-Algorithmus? Oder gibt es noch etwas, das mir fehlt?

Vielen Dank im Voraus für jede Eingabe, die Sie bereitstellen können.

Antwort

5

Frage 1 Ja, solange Sie keine APIs, die auf dem Telefon nicht erlaubt sind, zB Win32, MFC, etc. Einige der Standard-C-Funktionen haben einige Einschränkungen um sie herum; Zum Beispiel können Sie fopen nur für Dateien aufrufen, die sich im lokalen Bereich Ihrer Anwendungen befinden. Natürlich können Sie nur in C++ - Code auf die Funktionalität in Ihrer statischen Bibliothek zugreifen. Dieses Szenario nenne ich gerne das "Plain Old C++" -Szenario. Es funktioniert gut.

Frage 2 Ja, solange keine ref Klassen, die Sie in der statischen lib definieren nur aus diesem statischen lib verwendet werden soll. Also in Ihrem Beispiel, solange Klasse A eine reguläre alte C++ Klasse ist, wird es Ihnen gut gehen. Im Wesentlichen können Sie keine ref-Klassen verwenden, die im selben Sinne öffentlich sind wie öffentliche Klassen in einer .NET-Assembly, da dies einige COM-auf-Steroide-Magie erfordert und nur in Windows-Laufzeitkomponenten kompiliert wird. Wenn Sie einfachen C++ - Code haben, der Ihre Aufrufe von ref-Klassencode umschließt, und der Code, der Ihre statische lib konsumiert, konsumiert sie in einer einfachen alten C++ - Art, dann geht es Ihnen gut. Logic schlägt vor, dass Sie WinRT-Typen nicht aus der statischen Bibliothek herausgeben können, obwohl ich diese Annahme noch nicht getestet habe.

Frage 3 Ich glaube, der Artikel, dass Sie die Tatsache verweisen, dass verfehlten Code in einem statischen lib etc ref Klassen zugreifen kann, also keine Sorge, Sie müssen nicht Windows-Runtime-Komponenten-Wrapper schreiben um Ihre statische libs. Das möchten Sie nur tun, wenn Sie möchten, dass der Code in Ihrer statischen Bibliothek über "Public Classes" (im Sinne von .NET Assembly) verfügbar ist.

Die Sache zu erinnern ist, dass Sie immer noch eine statische lib "für den Windows-Store" erstellen. Es ist nativer Code, aber es kann immer noch alle C++/CX-Sachen machen, es enthält einfach nicht die COM-Aktivierung, um die darin definierten Typen außerhalb des statisch verknüpften C++ - Szenarios zugänglich zu machen.