首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置从CreateProcess创建的进程的搜索路径

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

Stack Overflow用户
提问于 2012-03-15 05:56:58
回答 1查看 1.8K关注 0票数 2

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

编译选项:

代码语言:javascript
复制
/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL

呼叫声:

代码语言:javascript
复制
if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
                   FALSE,0,NULL,NULL,&si,&pi) ) 
{
    //....
}

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

代码语言:javascript
复制
TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set

在没有任何#include命令的情况下,我得到了以下链接错误:

代码语言:javascript
复制
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'

我做错了什么?

我在网上搜索了过去6-7个小时的答案,但没有找到。使用windows API对我来说是个新鲜事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-15 06:26:14

如果你看看CreateProcess的定义

代码语言:javascript
复制
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结尾的字符串块组成。每个字符串的格式如下:

name=value\0

由于等号用作分隔符,因此不能在环境变量的名称中使用等号。

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

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

顺便说一句--我相信C++的标准是#include <iostream>,也就是没有.h

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9710893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档