Как запустить в режиме отладки программу, которая вызывает ссылку с CreateProcess - PullRequest
0 голосов
/ 20 марта 2012

Я использую 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 tools, все работает и создается dll.

Но, запустив его из отладчика VS, я получаю следующую ссылку:

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

или когда ссылки ссылок удаляются из параметров ссылки, я получаю следующую ошибку:

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

Что я делаю не так?

Похоже, что в параметрах ссылки что-то не хватает для запуска в режиме отладки, или в пути поиска в режиме отладки отсутствуют некоторые каталоги. Я не знаю, как исправить любой из этих случаев. Я гуглил это за последние 1/2 дня, но не нашел. Использование Windows API является новым для меня.

Заранее большое спасибо

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Вам необходимо указать расположение .lib файлов.В противном случае link не знает, где найти ваши .lib файлы.Вы можете сделать это либо в качестве аргументов командной строки для link (/LIBPATH:dir), либо установив переменную окружения LIB.

Где именно находятся эти .lib файлы, зависит от вашей установки.Откройте командную строку Visual Studio и введите set LIB, чтобы узнать, какой параметр подходит для вашей установки.

Сам я бы постарался избежать использования CreateProcess для автоматизации сборки, поскольку он имеетдовольно болезненный интерфейс.Я бы искал язык сценариев более высокого уровня.Я также предпочел бы использовать vcbuild вместо вызова cl и link вручную.Но, возможно, есть веская причина, по которой вам нужно делать это из кода C ++, о котором я не знаю.

0 голосов
/ 20 марта 2012

Звучит так, как будто вам не хватает переменных окружения, которые вы получаете при запуске из командной строки VS.Частью этого является также путь поиска в библиотеке.

См. C:\Program Files\Microsoft Visual Studio XX\Common7\vsvars32.bat (в зависимости от версии VS и пути установки, который указан в переменной среды VS100COMNTOOLS (или VS90COMNTOOLS, или когда-либо)).

Почему вы делаете это в любом случае? Вы можете использовать MSBuild для настройки проекта и его сборки. Вы можете вызывать MSBuild из своего кода, пока проект уже настроен для вас.

...