2012-03-20 44 views
0

我正在使用CreateProcess來調用cllink來編譯並鏈接另一個C++程序(TestProg.cxx)爲DLL。我找到了正確的編譯和鏈接選項:如何在調試模式下運行調用CreateProcess鏈接的程序

編譯選項:

/W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D _WINDOWS /D _USRDLL /D BUILDDLL_EXPORTS /D _WINDLL /D _UNICODE /D UNICODE /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /errorReport:queue /LD 

聯動選項:

/INCREMENTAL /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /ERRORREPORT:QUEUE /Entry:DllMain 

我打電話CreateProcess有:

if (CreateProcess(full path to cl.exe, compilation options, NULL,NULL,FALSE,0,  NULL,NULL,&si,&pi)) 
{ 
//.... 
} 

運行從VS應用工具提示,它的工作原理和DLL的創建。

但是從VS調試器,我得到以下鏈接錯誤運行它:

LINK : fatal error LNK1104: cannot open file 'kernel32.lib' 

,或者當鏈接庫從鏈接選項我碰到下面的錯誤刪除:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib' 

什麼我做錯了嗎?

IMO在調試模式下運行的鏈接選項中似乎缺少一些東西,或者調試模式的搜索路徑缺少一些目錄。我不知道如何解決這些情況。 我在過去的1/2天內搜索了這個,但沒有找到它。使用Windows API對我來說是新的。

非常感謝提前

+0

似乎你的環境設置不正確。確保你的'LIB'環境變量集和庫可以通過它進入 – Lol4t0 2012-03-20 19:16:13

回答

0

聽起來就像你缺少從VS命令行運行時獲得的環境變量。 這也是圖書館搜索路徑的一部分。

C:\Program Files\Microsoft Visual Studio XX\Common7\vsvars32.bat(取決於你的VS版本和安裝路徑,這是在VS100COMNTOOLS(或VS90COMNTOOLS規定,或曾經)環境變量上。

你爲什麼非得這麼做?你可能會使用的MSBuild來配置一個項目並構建它,你可以從代碼中調用MSBuild,而項目已經配置好了。

+0

感謝您的評論。我從運行提示中調用了vsvars32.bat,這沒有幫助。我這樣做是因爲我需要編寫一個C++程序,該程序使用一個函數讀取C++文件,運行它並計算運行期間執行的行數。我發現這樣做的方法是(1)在讀取源文件時修改源文件,以便在執行每行之前增加計數器值,添加一個返回計數器值(2)的get函數以將新程序構建到DLL中(3 )從我的程序調用DLL的函數,首先執行第二次獲取計數器值。如果你看到更好的方法,請告訴我。謝謝! – ZOK 2012-03-20 19:42:40

+1

要將新的源代碼構建到DLL中,您不必手動調用編譯器和鏈接器。您可以創建一個包含所需源文件的Visual Studio項目(或者甚至在運行時操作項目文件),並且只要調用devenv(Visual Studio的IDE)或MSBuild(如果您正在使用VS 2010)。 – Asaf 2012-03-20 19:59:47

+1

你也可以在VS2008上使用msbuild。這聽起來像你正在寫剖析器。是對的嗎? – 2012-03-20 23:06:14

1

您需要指定.lib文件的位置。否則link不知道在哪裏可以找到.lib文件。您可以將其作爲link/LIBPATH:dir)的命令行參數或通過設置LIB環境變量來完成。

這些.lib文件的確切位置取決於您的安裝。打開Visual Studio命令提示符,然後鍵入set LIB以找出適合您的安裝的設置。

我自己我試圖避免使用CreateProcess來構建自動化,因爲它有一個非常痛苦的界面。我正在尋找更高級別的腳本語言。我還希望使用vcbuild,而不是手動撥打cllink。但也許有一個很好的理由,你爲什麼需要從我不知道的C++代碼做到這一點。

相關問題