如何设置从CreateProcess创建的进程的搜索路径

时间:2012-03-14 21:56:58

标签: c++ visual-studio compiler-errors createprocess search-path

我正在使用CreateProcess来调用cl来编译并将另一个C ++程序(TestProg.cxx)链接到DLL中。我使用以下编译选项调用cl.exe

编译选项:

/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
电话:

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

如果TestProg.exe包含#include <iostream.h>,我收到以下编译错误:

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

没有任何#include命令,我收到以下链接错误:

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

我做错了什么?

我在网上搜索了最近6-7个小时的答案,但没找到。使用Windows API对我来说是新的。

1 个答案:

答案 0 :(得分:2)

如果你看一下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
);

您正在将可选参数__in_opt LPVOID lpEnvironment,设置为NULL

根据上述定义:

  

指向新进程的环境块的指针。如果此参数为NULL,则新进程使用调用进程的环境。

cl.exe从环境变量中获取其包含位置信息和库搜索路径 - 查看VS目录中的setenv.bat。在这种情况下,您的调用进程或目标进程都不会在设置了这些变量的环境中运行。

您可以选择 - 您可以根据MSDN自己创建环境变量:

  

环境块由以null结尾的块组成   以null结尾的字符串。每个字符串的格式如下:

name=value\0
     

因为等号用作分隔符,所以不得使用它   环境变量的名称。

或者您可以要求从VS工具提示符运行您的程序。一个很好的检查实际上问题是从这个提示符而不是Visual Studio运行你的程序,看看是否能解决这个问题。

不使用#include产生链接器错误的原因是由于如果没有包含,cl.exe将不会查找它们 - 它然后查找C / C ++运行时库。

作为旁注 - 我相信C ++中的标准是#include <iostream>,即没有.h