如何设置从CreateProcess创建的进程的搜索路径
-
14-12-2019 - |
题
我在用 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 对我来说是新的。
解决方案
如果你看一下定义 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
从环境变量获取其包含位置信息和库搜索路径 - 看看 setenv.bat
在VS目录下。在这种情况下,您的调用进程或目标进程都没有在设置这些变量的环境中运行。
你有一个选择 - 你可以根据 MSDN 自己创建环境变量:
环境块由无效的无终止字符串组成。每个字符串的形式如下:
name=value\0
因为相等的符号用作分离器,因此不得以环境变量的名称使用它。
或者您可以要求从 VS 工具提示符运行您的程序。一个很好的检查这实际上是问题的方法是从这个提示运行你的程序,而不是 Visual Studio,看看是否可以解决问题。
不使用的原因 #include
产生链接器错误是因为如果没有包含, cl.exe
不会寻找它们 - 然后它会寻找 C/C++ 运行时库。
作为旁注 - 我相信 C++ 中的标准是 #include <iostream>
即没有 .h
.
不隶属于 StackOverflow