Как правильно настроить мой пост-сборочный скрипт в Visual Studio

Итак, в настоящее время я пытаюсь создать файл .lib из своего исполняемого файла, используя сценарии сборки Visual Studio, как это предлагается в принятом ответе на этот пост: Связывание с несколькими .obj для модульного тестирования консольного приложения. По сути, сценарий после сборки, который они рекомендуют размещать в событии после сборки моего проекта, выглядит следующим образом:

lib /NOLOGO /OUT:"$(TargetPath).lib" "$(ProjectDir)\$(Configuration)\*.obj"

Вот как выглядит моя текущая структура каталогов:

-Solution
   - Project 
      -Source
         .cpp files
   - ProjectTester
   - Solution.sln

Итак, моя команда выглядит так:

lib /NOLOGO /OUT:"$(TargetPath).lib" "$(ProjectDir)\Source\*.obj"

В настоящее время это ничего не делает, как будто Visual Studio полностью игнорирует этот скрипт сборки. Мои вопросы:

Что именно разрешает $(TargetPath).lib?

а также

Верно ли мое текущее понимание этого сценария сборки? Если да, то как мне изменить этот скрипт, чтобы он делал то, что я хочу?

Обновлять:

Я изменил несколько пробелов в целевом пути и теперь получаю ошибку LNK1146 no argument specified with option /OUT:.


person Jason    schedule 26.03.2017    source источник


Ответы (1)


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

Один из способов изучить значения макросов, которые должны работать во всех версиях Visual Studio, — использовать команду ECHO. Измените свой скрипт после сборки, чтобы он был

echo TargetPath: "$(TargetPath)"

и вы должны иметь возможность прочитать значение макроса в окне вывода при построении проекта. Однако в большинстве современных версий Visual Studio трюк Echo не нужен.

На странице свойств Событие после сборки щелкните раскрывающийся список в конце поля Командная строка, а затем нажмите ‹ Изменить...>. В Visual Studio 2015 последующее диалоговое окно покажет вам командную строку (строки) и оцененное значение, чтобы вы могли видеть командную строку (строки) с развернутыми макросами.

Также есть кнопка Макросы>>. Нажмите на эту кнопку, и вы получите диалоговое окно, в котором показано имя каждого макроса и его значение. Текстовое поле в верхней части списка позволяет отфильтровать результаты по тем, которые содержат последовательность символов.

$(TargetPath) описывается здесь как "Абсолютный путь к основной выходной файл сборки (определяемый как диск + путь + базовое имя + расширение файла)". На самом деле это означает значение свойств Выходной каталог, Целевое имя и Целевое расширение в разделе Общие. страница свойства.

Инструмент LIB описан здесь. Чтобы получить больше информации о запуске LIB, вы можете добавить параметр /VERBOSE. Вы также можете удалить параметр /NOLOGO, чтобы по крайней мере получить подтверждение того, что вы используете LIB (и используете правильную версию LIB).

Трудно сказать, что на самом деле означает «ничего не делает». Я предполагаю, что наиболее вероятными сбоями являются либо создание файла lib, но не там, где вы ожидаете; или в $(ProjectDir)\Source нет файлов obj.

Один из способов изучить этот последний случай — изменить событие после сборки на

dir "$(ProjectDir)\Source\*.obj"

а затем проверьте выходные данные сборки, чтобы увидеть, есть ли в списке файлы obj. Если в каталоге нет файлов .obj, окно вывода покажет что-то похожее на

1>   Directory of C:\TestPrograms\vc.net.2015\VCConsole
1>
1>  File Not Found

и окно списка ошибок покажет, что команда dir завершилась с кодом 1.

person Frank Boyne    schedule 27.03.2017
comment
Вы поняли, сэр. Это то, что я получаю за ослепление по вставленному коду (позор мне). Мои файлы .obj, очевидно, выводились в мой собственный промежуточный каталог, а не в исходный каталог. Как только это было решено, все заработало. Спасибо. - person Jason; 27.03.2017
comment
P.S. Это был VS 2015 - person Jason; 27.03.2017