[英]How to run in debug mode a program that calls link with CreateProcess
我正在使用CreateProcess
调用cl
和link
来编译和链接另一个C ++程序( TestProg.cxx
)到DLL中。 我找到了正确的编译和链接选项:
编译选项:
/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错误:
LINK : fatal error LNK1104: cannot open file 'kernel32.lib'
或从链接选项中删除链接库时,出现以下错误:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
我究竟做错了什么?
IMO似乎在调试模式下运行的链接选项中缺少某些内容,或者调试模式的搜索路径缺少某些目录。 我不知道如何解决这些情况。 我用Google搜索了过去1/2天,但没有找到。 使用Windows API对我来说是新手。
提前谢谢了
您需要指定.lib文件的位置。 否则, link
不知道在哪里可以找到您的.lib文件。 您可以作为link
命令行参数( /LIBPATH:dir
)或通过设置LIB
环境变量来执行此操作。
这些.lib文件的确切位置取决于您的安装。 打开Visual Studio命令提示符,然后键入set LIB
以找出适合您的安装的设置。
我本人将尽量避免使用CreateProcess
进行构建自动化,因为它具有非常痛苦的界面。 我正在寻找一种高级脚本语言。 我也希望使用vcbuild
而不是手动调用cl
和link
。 但是,也许有一些很好的理由说明为什么您需要从我不知道的C ++代码中执行此操作。
听起来好像缺少从VS命令行运行时获得的环境变量。 这也是库搜索路径的一部分。
请参阅C:\\Program Files\\Microsoft Visual Studio XX\\Common7\\vsvars32.bat
(取决于您的VS版本和安装路径,该路径在VS100COMNTOOLS
(或VS90COMNTOOLS
或任何一个)环境变量中指定。
你为什么要这样做? 您可能正在使用MSBuild来配置项目并对其进行构建。 您已经为您配置了项目,则可以从代码中调用MSBuild。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.