Де Visual Studio шукає файли заголовків на C ++?


94

Я перевірив копію програми C ++ із SourceForge (HoboCopy, якщо вам цікаво) і спробував її скомпілювати.

Visual Studio повідомляє мені, що не може знайти певний файл заголовка. Я знайшов файл у дереві джерела, але куди мені його потрібно помістити, щоб він був знайдений під час компіляції?

Чи існують спеціальні довідники?

Відповіді:


114

Visual Studio шукає заголовки в такому порядку:

  • У поточному вихідному каталозі.
  • У Додаткових каталогах Включити у властивості проекту ( Проект -> [назва проекту] Властивості , під C / C ++ | Загальні).
  • У Visual Studio C ++ включіть каталоги під ІнструментиПараметриПроекти та рішенняКаталоги VC ++ .
  • У нових версіях Visual Studio (2015+) вищезазначена опція застаріла, а список каталогів, що включають за замовчуванням, доступний у розділі Властивості проектуКонфігураціяКаталоги VC ++

У вашому випадку додайте каталог, яким є заголовок, до властивостей проекту ( Властивості проектуКонфігураціяC / C ++ЗагальнеДодаткові включені каталоги ).


3
Приємна відповідь, але я повинен додати, що у Visual Studio 2003 ви повинні дивитись на "Інструменти | Параметри | Каталоги VC ++", а не "Інструменти | Параметри | Проекти та рішення | Каталоги VC ++".
Граф

36
препроцесор у VS 2010 переглядає поточний каталог, лише якщо використовується цитований синтаксис (наприклад, #include "whatever.h"). Використовуючи кутові дужки (наприклад, #include <whatever.h>) опускає поточний каталог ( msdn.microsoft.com/en-us/library/36k2cdd4(v=VS.100).aspx )
Денніс Мюнкл,

5
У Visual Studio 2010 та новіших версіях "стандартні каталоги на C ++" більше не знаходяться в інструментах-> параметри та знаходяться в загальній таблиці властивостей: blogs.msdn.com/b/vsproject/archive/2009/07/07/…
Mooing Качка

8
Цікаво, що ще ніхто не сказав просто каталог за замовчуванням. Отже, ось воно <root dir of Visual Studio>/VC/include/. У мене на робочому ПК є MSVC від попереднього користувача, але я використовую GNU / Linux і не хотів запускати VC лише для того, щоб задовольнити свою цікавість поглянути на заголовки Microsoft®. До речі, про те, яка у мене була цікавість: я виявив, що MSDN навіть не знає, що це власні назви заголовків! Тобто вони посилалися Iphlpapi.h, але такого файлу не існує, це, швидше iphlpapi.h, назва ( або IPHlpApi.hтам є обидва)! lol
Hi-Angel

17
Варіант "VS> Інструменти> Параметри> Проекти та рішення> Каталоги VC ++" тепер скасовано.
BG BRUNO

21

Насправді на моєму вікні 10 із спільнотою Visual Studio 2017 шлях до заголовків C ++:

  1. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\include

  2. C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\ucrt

Перший містить стандартні C ++ заголовки , такі як <iostream>, <algorithm>. Другий містить старі заголовки C , такі як <stdio.h>, <string.h>. Номер версії може бути різним залежно від вашого програмного забезпечення.

Сподіваюся, це допоможе.


1
Це найбільш пряма відповідь на ОП. Хоча інші відповіді говорять про інші питання, це має бути прийнятою відповіддю.
winux

@linrongbin Я очищаю каталоги, створені в останній установці VS Build Tools. Ви маєте рацію щодо першого. Але я зняв прапорець Windows SDK, так що це фактично означає, що у мене немає заголовків C, а це, в свою чергу, означає, що робочий процес C ++ у BuildTools не підтримує C.
Hatebit

11

Якщо проект постачався з файлом проекту Visual Studio, то це вже слід налаштувати для пошуку заголовків для вас. Якщо ні, вам доведеться додати каталог включення файлу до налаштувань проекту, клацнувши проект правою кнопкою миші та вибравши Властивості, клацнувши на «C / C ++» та додавши каталог, що містить файли включення, до «Додаткових каталогів включення». поле редагування.


6

Спробував додати це як коментар до публікації Роба Пруза , але відсутність форматування зробило це незрозумілим.

У Visual Studio 2010 діалогове вікно "Інструменти | Параметри | Проекти та рішення | Каталоги VC ++" повідомляє, що "Редагування каталогів VC ++ в" Інструменти> Параметри "застаріло", пропонуючи використовувати досить інтуїтивно зрозумілий диспетчер властивостей.

Якщо ви дійсно хочете оновити стандартний $ (IncludePath) за замовчуванням, вам потрібно зламати відповідний запис в одному з файлів XML:

\ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ Win32 \ PlatformToolsets \ v100 \ Microsoft.Cpp.Win32.v100.props

або

\ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ x64 \ PlatformToolsets \ v100 \ Microsoft.Cpp.X64.v100.props

(Можливо, не рекомендується корпорацією Майкрософт.)


6

Схоже, у спільноті Visual Studio 2015 є помилка. Для 64-розрядного проекту папку включення не знайдено, якщо вона не знаходиться в списку додаткових папок Включити win32 .


3
У вас є посилання на цю помилку або посилання на неї, будь ласка?
Preet Sangha

Ні, я сам знайшов і не повідомив про це
Маркус,

5

Існує більш нове запитання, що вирішує проблему, краще запитувати. Як працюють шляхи включення у Visual Studio?

Розкрито спосіб зробити це в нових версіях VisualStudio

  • лише у поточному проекті (оскільки питання також задано тут), а також
  • для кожного нового проекту за замовчуванням

Друге - це те, що пояснює відповідь Стіва Вілкінсона вище, - це те, що, як він припускав, не те, що рекомендує Microsoft.

Щоб сказати це по короткому шляху тут: зробіть це, але зробіть це в User-Directory на

C: \ Users \ UserName \ AppData \ Local \ Microsoft \ MSBuild \ v4.0

у XML-файлі

Microsoft.Cpp.Win32.user.props

та / або

Microsoft.Cpp.x64.user.props

а не в директорії програмних файлів C: \, де, як очікується, буде перебувати незмінений заводський файл Microsoft.

Потім ви робите це так, як це робить VisualStudio, і все регулярно.

Для отримання додаткової інформації, чому це робити, дивіться мою відповідь там .


1
Якби тільки в заголовку було "C ++", і визнано помилку, яка шукає 64-бітові шляхи у розділі 32-бітового шляху
Маркус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.