Pregunta

estoy usando CreateProcess invocar cl para compilar y vincular otro programa C++ (TestProg.cxx) en una DLL.yo invoco cl.exe con las siguientes opciones de compilación:

opciones de compilación:

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

la llamada:

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

Si TestProg.exe contiene #include <iostream.h> Recibí el siguiente error de compilación:

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

Sin ningún #include comando, recibí el siguiente error de vinculación:

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

¿Qué estoy haciendo mal?

Busqué la respuesta durante las últimas 6 a 7 horas en la web, pero no la encontré.Usar la API de Windows es nuevo para mí.

¿Fue útil?

Solución

Si nos fijamos en la definición de 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
);

Estás configurando el parámetro opcional. __in_opt LPVOID lpEnvironment, a NULL.

Según dicha definición:

Un puntero al bloque de entorno para el nuevo proceso.Si este parámetro es NULL, el nuevo proceso utiliza el entorno del proceso que llama.

cl.exe obtiene su información de ubicación incluida y rutas de búsqueda de biblioteca a partir de variables de entorno; eche un vistazo a setenv.bat en el directorio VS.En este caso, ni el proceso de llamada ni el proceso de destino se ejecutan en un entorno donde se establecen estas variables.

Tiene una opción: puede crear las variables de entorno usted mismo de acuerdo con MSDN:

Un bloque de entorno consiste en un bloque nulo terminado de cuerdas nulas terminadas.Cada cadena tiene la siguiente forma:

name=value\0

Debido a que el signo igual se usa como separador, no debe usarse en nombre de una variable de entorno.

O puede solicitar que su programa se ejecute desde el indicador de herramientas VS.Una buena comprobación de que este es realmente el problema sería ejecutar su programa desde este mensaje, en lugar de Visual Studio, para ver si eso soluciona el problema.

La razón por la que no se usa #include produce un error del vinculador se debe al hecho de que si no hay inclusiones, cl.exe no los buscará; luego busca las bibliotecas de tiempo de ejecución de C/C++.

Como nota al margen, creo que el estándar en C++ es #include <iostream> es decir sin el .h.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top