2016-05-04 9 views
1

Ich entwickle einige Windows-Software, die manchmal in eingebetteten Szenarien verwendet wird. Das ist nicht ungewöhnlich für meine Benutzer, einen dedizierten Win7 oder Win8 PC zu haben, den sie nie aktualisieren, nicht sogar eine Verbindung zum Internet. Benutzer schließen diesen PC an eine bestimmte industrielle Hardware an und verwenden dieses System nur für einen Job.Statische Verbindung mit Microsoft CRT und OpenMP

Meine Software enthält Komponenten, die ich in Visual C++ geschrieben habe. Ich schließe CRT in meine MSI-Pakete mit geeigneten Installer Merge-Modulen ein.

Leider, für einen PC, der nie aktualisiert, das funktioniert nicht: Heute habe ich einen Fehlerbericht, die App stürzt beim Start sagt "kann nicht gestartet werden, weil api-ms-win-crt-stdio-l1- 1-0.dll fehlt auf Ihrem Computer "

This answer schlägt statische Verbindung zu CRT vor.

Hat das getan. Aber einige Teile meines C++ Codes verlassen sich auf OpenMP für Parallelität.

Dependency walker zeigt mir die DLL, die ich aufbaue, hängt von vcomp140.dll selbst wenn mit Multi-threaded (/MT) Laufzeitbibliothek Einstellungen kompiliert.

Auch zeigt es vcomp140.dll hängt nur von kernel32.dll und user32.dll.

Kann ich einfach diese einzelne DLL, vcomp140.dll, im Installationsordner ablegen? Funktioniert es auf offline Windows 7 PC?

+0

Statisch Verknüpfung gegen die CRT häufig vorgeschlagen, aber nicht unbedingt die beste Idee (siehe [Mögliche Fehler beim Überschreiten von CRT-Objekten über DLL-Grenzen hinweg] (https://msdn.microsoft.com/en-us/library/ms235460.aspx)). Eine bessere Lösung ist die Bereitstellung Ihrer Abhängigkeiten (CRT und andere) neben Ihrer Anwendung. Erwarten Sie nicht, eine bestimmte DLL einer bestimmten Version auf einem bestimmten Clientcomputer zu finden. – IInspectable

+0

Ich übergebe nur COM-Schnittstellen über DLL-Grenzen, so dass dies kein Problem ist. Abhängigkeiten von nie aktualisierten Windows 7 können nicht bereitgestellt werden, da für die moderne CRT das KB2999226-Windows-Update erforderlich ist. – Soonts

+0

Wenn KB2999226 das einzige Problem ist, habe ich Software gesehen, die mit einem oder mehreren Windows-Updates ausgeliefert wird. Nicht sicher, ob Sie eine spezielle Lizenz benötigen, um das zu tun oder nicht. Alternativ kenne ich OpenMP nicht sehr gut, aber ich gehe davon aus, dass es offen ist. Können Sie es direkt in Ihre Anwendung übersetzen? Kombiniert mit einer statischen Laufzeit könnte dies das Problem beheben. –

Antwort

1

Basierend auf der VS2015 Redistribution List würde ich sagen, dass das Kopieren dieser Datei wäre in der Tat, was Sie tun müssen und würde gut funktionieren (wenn Sie VS2015 verwendet, um Ihre App zu bauen). Achten Sie darauf, die richtige DLL basierend auf arm/x86/x64 zu kopieren.

+0

Danke, was du hier gesagt hast, funktioniert jetzt auf meinem VmWare Windows 7 sp0. – Soonts

+0

Aber zuerst habe ich den empfohlenen Weg versucht, mit MS-Merge-Modul. Technisch funktioniert das auch ohne installierte CRT. Das Problem ist, das Merge-Modul installiert vcomp140.dll zu System32. Das bedeutet, dass meine App möglicherweise beschädigt wird, wenn eine andere App meine vcomp140.dll in System32 aktualisiert/downgradet/deinstalliert. Also ja, am Ende nur mit der DLL. – Soonts

+0

Was ist mit OpenMP? Irgendein Trick, um es in Visual Studio statisch zu verbinden? – Royi

1

Nur um es zu verdeutlichen, ist es nicht möglich, statisch openmp mit Visual Studio zu verknüpfen. Nur zwei Dinge können Sie tun:

  • Remove openmp (und kompilieren mit/MT/MTD)
  • deploy vcomp140.dll (oder VC verteilbare) mit Ihrer Anwendung