2

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

4

1 回答 1

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从环境变量中获取其包含位置信息和库搜索路径 - 查看setenv.batVS 目录。在这种情况下,您的调用进程或目标进程都没有在设置了这些变量的环境中运行。

你有一个选择——你可以根据 MSDN 自己创建环境变量:

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

name=value\0

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

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

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

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

于 2012-03-14T22:26:13.863 回答