2012-03-14 139 views
2

我使用CreateProcess來調用cl來編譯並鏈接另一個C++程序(TestProg.cxx)到DLL中。我調用cl.exe與以下編譯選項:如何設置從CreateProcess創建的進程的搜索路徑

編譯選項:

/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對我來說是新的。

回答

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

據所說定義:

A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process.

cl.exe得到它包括從環境變量的位置信息和庫搜索路徑 - 必須在VS目錄一看setenv.bat。在這種情況下,調用進程或目標進程都不會在設置了這些變量的環境中運行。

你有一個選擇 - 你可以創建自己根據MSDN的環境變量:

An environment block consists of a null-terminated block of null-terminated strings. Each string is in the following form:

name=value\0 

Because the equal sign is used as a separator, it must not be used in the name of an environment variable.

或者你可以要求你的程序從VS工具提示符下運行。一個很好的檢查,實際上問題是從這個提示符運行你的程序,而不是Visual Studio,看看是否能解決這個問題。

不使用#include會導致鏈接器錯誤的原因是因爲如果沒有include,cl.exe不會查找它們 - 它會查找C/C++運行時庫。

作爲一個附註 - 我相信C++中的標準是#include <iostream>,即沒有.h

+0

感謝您的評論。根據附註更新到#include 。從命令行運行它我得到以下鏈接錯誤:[LINK:致命錯誤LNK1561:入口點必須定義]也沒有#包括。請讓我知道可能是什麼問題?它是環境變量嗎?如何設置它們?謝謝 – ZOK 2012-03-15 09:57:57

+0

@ZOK,LNK1561 - 您忘記了包含主要功能。這是您的應用的入口點。 – 2013-03-02 05:14:54