Frage

ich benutze CreateProcess aufrufen cl um ein anderes C++-Programm zu kompilieren und zu verknüpfen (TestProg.cxx) in eine DLL.Ich rufe an cl.exe mit folgenden Kompilierungsoptionen:

Kompilierungsoptionen:

/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL

der Anruf:

if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
                   FALSE,0,NULL,NULL,&si,&pi) ) 
{
    //....
}

Wenn TestProg.exe enthält #include <iostream.h> Ich habe den folgenden Kompilierungsfehler erhalten:

TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set

Ohne irgendetwas #include Befehl, ich habe den folgenden Verknüpfungsfehler erhalten:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'

Was mache ich falsch?

Ich habe die Antwort in den letzten 6-7 Stunden im Internet gesucht, sie aber nicht gefunden.Die Verwendung der Windows-API ist für mich neu.

War es hilfreich?

Lösung

Wenn Sie sich die Definition von ansehen CreateProcess:

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);

Sie legen den optionalen Parameter fest __in_opt LPVOID lpEnvironment, Zu NULL.

Nach besagter Definition:

Ein Zeiger auf den Umgebungsblock für den neuen Prozess.Wenn dieser Parameter NULL ist, verwendet der neue Prozess die Umgebung des aufrufenden Prozesses.

cl.exe erhält seine Include-Standortinformationen und Bibliothekssuchpfade aus Umgebungsvariablen – schauen Sie sich das an setenv.bat im VS-Verzeichnis.In diesem Fall werden weder Ihr aufrufender Prozess noch Ihr Zielprozess in einer Umgebung ausgeführt, in der diese Variablen festgelegt sind.

Sie haben die Wahl – Sie können die Umgebungsvariablen gemäß MSDN selbst erstellen:

Ein Umgebungsblock besteht aus einem nullterminierten Block von Null-terminierten Saiten.Jede Zeichenfolge hat die folgende Form:

name=value\0

Da das gleiche Zeichen als Trennzeichen verwendet wird, darf es im Namen einer Umgebungsvariablen nicht verwendet werden.

Oder Sie können verlangen, dass Ihr Programm über die VS-Tools-Eingabeaufforderung ausgeführt wird.Eine gute Überprüfung, ob das tatsächlich das Problem ist, wäre, Ihr Programm über diese Eingabeaufforderung und nicht über Visual Studio auszuführen, um zu sehen, ob das Problem dadurch behoben wird.

Der Grund für die Nichtverwendung #include erzeugt einen Linker-Fehler, der darauf zurückzuführen ist, dass keine Includes vorhanden sind. cl.exe sucht nicht danach, sondern sucht dann nach den C/C++-Laufzeitbibliotheken.

Als Randbemerkung: Ich glaube, dass der Standard in C++ darin besteht #include <iostream> d.h. ohne die .h.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top