Domanda

sto usando CreateProcess invocare cl per compilare e collegare un altro programma C++ (TestProg.cxx) in una DLL.invoco cl.exe con le seguenti opzioni di compilazione:

opzioni di compilazione:

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

la chiamata:

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

Se TestProg.exe contiene #include <iostream.h> Ho ricevuto il seguente errore di compilazione:

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

Senza alcun #include comando, ho ricevuto il seguente errore di collegamento:

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

Che cosa sto facendo di sbagliato?

Ho cercato la risposta nelle ultime 6-7 ore sul web, ma non l'ho trovata.L'utilizzo dell'API di Windows è nuovo per me.

È stato utile?

Soluzione

Se guardi la definizione di 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
);

Stai impostando il parametro facoltativo __in_opt LPVOID lpEnvironment, A NULL.

Secondo detta definizione:

Puntatore al blocco di ambiente per il nuovo processo.Se questo parametro è NULL, il nuovo processo utilizza l'ambiente del processo chiamante.

cl.exe ottiene le informazioni sulla posizione e i percorsi di ricerca della libreria dalle variabili di ambiente: dai un'occhiata setenv.bat nella directory VS.In questo caso, né il processo chiamante né il processo di destinazione sono in esecuzione in un ambiente in cui sono impostate queste variabili.

Hai una scelta: puoi creare tu stesso le variabili di ambiente secondo MSDN:

Un blocco ambientale è costituito da un blocco di stringhe a termini nulli.Ogni stringa è nella seguente forma:

name=value\0

Poiché il segno uguale viene utilizzato come separatore, non deve essere utilizzato a nome di una variabile di ambiente.

Oppure puoi richiedere che il tuo programma venga eseguito dal prompt degli strumenti VS.Un buon controllo su questo è effettivamente il problema sarebbe eseguire il programma da questo prompt, anziché da Visual Studio, per vedere se questo risolve il problema.

Il motivo per cui non lo utilizzo #include produce un errore del linker è dovuto al fatto che se non ci sono include, cl.exe non li cercherà, quindi cercherà le librerie di runtime C/C++.

Come nota a margine: credo che lo standard in C++ sia quello #include <iostream> cioè senza il .h.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top