我在用 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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top