我正在使用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对我来说是新的。
答案 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
。