Как установить с помощью Visual Studio $(OutDir), $(TargetName), $(TargetExt) и% (Lib.OutputFile)?

Я пытаюсь создать gtest в Visual Studio 2010. После преобразования файла решения я попытался построить, и я получил следующее предупреждающие сообщения.

Warning 1   warning MSB8012: 
TargetPath(C:\Users\sucho\Desktop\gtest-1.5.0\msvc\gtest/Debug\gtest.lib) does not match
the Library OutputFile property value (C:\Users\sucho\Desktop\gtest-1.5.0\msvc\gtest\
Debug\gtestd.lib).

This may cause your project to build incorrectly. 
To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property
values match the value specified in %(Lib.OutputFile).  
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets

В сообщении говорится, что мне нужно настроить переменные $(OutDir), $(TargetName) и $(TargetExt) вместе со значениями свойств, указанными в %(Lib.OutputFile).

Как я могу сделать это с помощью Visual Studio (особенно VS 2010)?

Ответы

Ответ 1

Предупреждение является ложным - если вы используете Google Test, он отлично работает

Вы можете заставить его уйти. Щелкните правой кнопкой мыши на оскорбительном проекте и выберите свойства. Выберите "Библиотекарь" в древовидной структуре слева и измените элемент "Выходной файл" справа, щелкнув поле рядом с выходным файлом и выбрав "Наследовать от родительских или по умолчанию по умолчанию".

Ответ 2

Я вижу это. Щелкните правой кнопкой мыши по проекту gtest, свойствам, свойствам конфигурации, общим. Убедитесь, что выбрана конфигурация отладки (верхняя левая комбинация). Измените свойство Target Name на

 $(ProjectName)d

Обратите внимание на добавленный "d", чтобы изменить имя от gtest до gtestd. Предупреждение в противном случае является доброкачественным.

Ответ 3

Я думаю, что у кого-то нет правильного ответа, я решил так: на страницах свойств проекта проверьте, соответствуют ли linker->General->Output file configuration properties->General->target name и configuration properties->General->target extension.

Вам не нужно добавлять никаких "d", конечно, более просто установить на Inherit from parent or project defaults для всех трех переменных.

Пример:

Linker → General → Output File = "myproject.exe"

то

Configuration Properties → General → Target Name = "myproject"

configuration properties → General → Target Extension = ".exe"

Ответ 4

Такие ошибки обычно возникают при обновлении старого проекта до новой версии Visual Studio (например, в вашем случае до VS2010), а также при изменении настроек проекта (например, изменение имени исполняемого файла). Мы знаем, что VS2010 использует эти макросы $(ProjectName) $(TargetName) $(OutDir) $(TargetExt) для управления выходами отладки/отладки, но часто бывает загадкой, где их менять. Мы, как правило, предпочитаем изменять имя выходных файлов непосредственно через Project → Properties. Это означает, что теперь мы должны изменить выходные файлы отдельно для сборки отладки и выпуска, и если бы были какие-либо зависимости, мы получим ошибку, например This may cause your project to build incorrectly..

Эти макросы/свойства являются значениями по умолчанию VS2010, но вы можете установить их самостоятельно в файлах .vcproj, отредактировав их в блокноте. Сначала сначала найдите поиск свойства в файле .vcproj, если его там, чем измените его значение, если не определить его, как показано ниже.

  <PropertyGroup Label="My Values">
    <ProjectName>New_Project_Name</ProjectName>
  </PropertyGroup>

Выше я определил новый <property group>, чтобы сохранить эти значения, но вы можете определить их где угодно. Я определяю это в верхней части файла сразу после группы конфигурации отладки/выпуска, поэтому он отображается повсюду. Убедитесь, что свойства проекта правильно настроены для правильного их использования (они должны соответствовать настройкам по умолчанию VS2010). Если вы изменили их, вы должны скопировать его из нового тестового проекта. Разумеется, вы можете добавить другие макросы, которые вы хотите установить в этой группе.

Вы также можете проверить новые значения этих макросов через свойства проекта. Например, щелкните Свойства конфигурации → Общие, а не в поле "Целевое имя". Выберите править. Появится диалоговое окно с кнопкой 'MACROS >>'. Нажмите это, и он покажет вам, каково значение каждого макроса. Он должен правильно отражать новые значения, которые вы установили в файле .vcproj.

Ответ 6

В основе этого лежит то, что Microsoft изменила значение макроса $(TargetName). Раньше это означало "любое имя файла, которое вы помещаете в файл компоновщика Linker, минус расширение". Они изменили его на "по умолчанию, название вашего проекта". (По-моему, этого никогда не следует делать, они должны добавить новый макрос).

В то время как VS2008 и ранее были способны разбирать имя файла из настройки Linker, видимо, они не смогли разобрать его в переходе на более новые версии, оставив наши конфигурации сломанными.

Само предупреждение, вероятно, не важно, но если вы используете $(TargetName), скажем, передав его в пакетный файл, это изменение нарушит ваш пакетный процесс.

Для нас решением было скопировать имя файла (минус расширение) из Linker | Выходной файл в общий | Target Name, а затем установите Linker | Выходной файл - "наследовать от родителя/по умолчанию". Это потому, что мы используем суффиксы типа "d" (для отладки), "u" для Unicode, _64 для 64-бит и так далее.

С другой стороны, если ваш выходной файл всегда совпадает с именем проекта, тогда вам нужно установить Linker | Выходной файл "наследует по умолчанию", и в принципе вы сделали это, указав, что выходной каталог, который вы хотите для скомпилированного файла, соответствует General | Выходной каталог.

Это изменение совершенно бесит, потому что это связано с перемещением буквально сотен настроек вокруг, все из-за чистой лени на стороне Microsoft, насколько я вижу.

Ответ 7

Я просто пытался скомпилировать приложение в Visual Studio 2019, которое последний раз компилировалось в Visual Studio 2005. Я столкнулся с тем же предупреждением.

Я думал, что покажу, что я делал визуально, с помощью снимков экрана.

Имя решения v Имя цели

Как видите, обе мои переменные были установлены на Импорт текста:

Image 1

Я мог бы просто установить $(TargetName) в ImportText, чтобы решить мою проблему. Однако мы оставим эти значения такими, какие они есть.

Линкер/Общий выходной файл

Вот как я настроил выходной файл:

Image 2

Обратите внимание, что я переопределил выходное имя цели как ImportText. Это было более 10 лет назад, и у меня не было такого большого опыта.

Общее/Целевое Имя

Так что все, что мне нужно было сделать, это сделать ту же настройку здесь:

Image 3

Теперь он компилирует файл.