我使用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对我来说是个新鲜事。
发布于 2012-03-15 06:26:14
如果你看看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结尾的字符串块组成。每个字符串的格式如下:
name=value\0
由于等号用作分隔符,因此不能在环境变量的名称中使用等号。
或者,您可以要求从VS工具提示符下运行您的程序。一个很好的检查这实际上是问题将是从这个提示符运行你的程序,而不是Visual Studio,看看这是否解决了问题。
不使用#include产生链接器错误的原因是,如果没有包含,cl.exe将不会查找它们-然后它会查找C/C++运行时库。
顺便说一句--我相信C++的标准是#include <iostream>,也就是没有.h。
https://stackoverflow.com/questions/9710893
复制相似问题