Question

Je suis à l'aide de CreateProcess pour appeler cl pour compiler et lier un autre programme en C++ (TestProg.cxx) dans une DLL.J'invoque cl.exe avec suivant les options de compilation:

les options de compilation:

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

l'appel:

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

Si TestProg.exe contient #include <iostream.h> J'ai eu l'erreur de compilation suivante:

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

Sans #include commande, j'ai reçu la suite de couplage d'erreur:

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

Ce que je fais mal?

J'ai cherché la réponse à la dernière 6-7 heures sur le web, mais je n'ai pas à le trouver.À l'aide de l'API windows est nouveau pour moi.

Était-ce utile?

La solution

Si vous regardez la définition 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
);

Vous êtes le réglage du paramètre facultatif __in_opt LPVOID lpEnvironment, pour NULL.

Selon ladite définition:

Un pointeur vers le bloc d'environnement pour le nouveau processus.Si ce paramètre est NULL, le nouveau procédé utilise de l'environnement du processus appelant.

cl.exe obtient ses inclure les informations de localisation et de la bibliothèque des chemins de recherche à partir des variables d'environnement - avoir un regard sur setenv.bat dans le VS répertoire.Dans ce cas, ni votre processus appelant ou votre cible processus sont en cours d'exécution dans un environnement où ces variables sont définies.

Vous avez le choix - vous pouvez créer des variables d'environnement en fonction du MSDN:

Un bloc d'environnement se compose d'un nul bloc de null cordes.Chaque chaîne est sous la forme suivante:

name=value\0

Parce que le signe égal est utilisé comme séparateur, il ne doit pas être utilisé dans le nom d'une variable d'environnement.

Ou vous pouvez exiger de votre programme à exécuter à partir de la VS outils invite.Un bon de vérifier que c'est effectivement le problème serait de exécuter votre programme à partir de cette invite, plutôt que de Visual Studio, pour voir si cela résout le problème.

La raison de ne pas utiliser #include produit une erreur de l'éditeur de liens est en raison du fait si il n'y a pas inclut, cl.exe ne convient pas pour eux - il s'agit ensuite pour le C/C++ runtime libs.

Comme une note de côté - je crois que le standard en C++ est à #include <iostream> j'.e sans l' .h.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top