Pergunta

Eu estou usando CreateProcess para invocar cl para compilar e ligar outro programa C++ (TestProg.cxx) em uma DLL.Eu invoco cl.exe com as seguintes opções de compilação:

opções de compilação:

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

a chamada:

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

Se TestProg.exe contém #include <iostream.h> Eu tenho o seguinte erro de compilação:

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

Sem qualquer #include comando, eu tenho a seguinte ligação de erro:

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

O que estou fazendo de errado?

Eu procurei a resposta para a última 6-7 horas na web, mas não encontrá-lo.Usando a API do windows é novo para mim.

Foi útil?

Solução

Se você olhar para a definição 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
);

Você está definindo o parâmetro opcional __in_opt LPVOID lpEnvironment, para NULL.

De acordo com a referida definição:

Um ponteiro para o bloco de ambiente para o novo processo.Se este parâmetro for NULL, o novo processo usa o ambiente do processo de chamada.

cl.exe fica a sua incluir informações de localização e caminhos de pesquisa de biblioteca a partir de variáveis de ambiente - ter um olhar para setenv.bat no VS directory.Neste caso, nem o seu processo de chamada ou seu processo de destino estiver executando em um ambiente onde estas variáveis são definidas.

Você tem uma escolha: você pode criar as variáveis de ambiente a si mesmo de acordo com o MSDN:

Um bloco de ambiente consiste de um terminada com nulo bloco de seqüências de terminação nula.Cada seqüência de caracteres é o seguinte formulário:

name=value\0

Porque o sinal de igual é utilizado como um separador, ele não deve ser usado em o nome de uma variável de ambiente.

Ou você pode exigir o seu programa para ser executado a partir do VS ferramentas de linha de comandos.Uma boa seleção este é, na verdade, o problema não seria executar o programa a partir desta linha de comandos, em vez de Visual Studio, para ver se isso corrige o problema.

A razão para não usar #include produz um erro de vinculador é devido ao fato de se não há inclui, cl.exe não olhar para eles - em seguida, ele olha para o C/C++, bibliotecas de tempo de execução.

Como uma nota lateral - eu acredito que o padrão em C++ é a #include <iostream> eu.e sem a .h.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top