visual c ++: #включіть файли інших проектів у таке ж рішення


113

Я працюю над грою за допомогою Visual C ++. Я маю деякі компоненти в окремих проектах і встановив залежність від проекту. Як я включаю файл заголовка з іншого проекту? Я поняття не маю, як використовувати класи з одного проекту в інший.

Відповіді:


200

Налаштування компілятора

У проекті, де ви хочете # включити файл заголовка з іншого проекту, вам потрібно буде додати шлях файлу заголовка до розділу Додаткові включення каталогів у конфігурації проекту.

Для доступу до конфігурації проекту:

  1. Клацніть правою кнопкою миші проект і виберіть Властивості.
  2. Виберіть Властивості конфігурації-> C / C ++ -> Загальні.
  3. Встановіть шлях у розділі Додаткові включення каталогів.

Як включити

Щоб включити файл заголовка , просто введіть у свій код таке:

#include "filename.h"

Зауважте, що вам тут не потрібно вказувати шлях, оскільки ви вже включаєте каталог у Додаткові каталоги включення, тому Visual Studio буде знати, де його шукати.

Якщо ви не хочете додавати кожне розташування файлу заголовка в налаштуваннях проекту, ви можете просто включити каталог до точки, а потім #include щодо цієї точки:

// In project settings
Additional Include Directories    ..\..\libroot

// In code
#include "lib1/lib1.h"    // path is relative to libroot
#include "lib2/lib2.h"    // path is relative to libroot

Налаштування для лінкера

Якщо ви використовуєте статичні бібліотеки (тобто .lib-файл), вам також потрібно буде додати бібліотеку до входу лінкера, щоб під час з'єднання символи могли бути пов’язані (інакше ви отримаєте невирішений символ):

  1. Клацніть правою кнопкою миші проект і виберіть Властивості.
  2. Виберіть Властивості конфігурації-> Linker-> Input
  3. Введіть бібліотеку в розділі Додаткові залежності.

6
Чи можу я просто сказати, що після ранкового читання відповідей на цю тему на ТАК, ваші в найяскравішому та всебічному, що я натрапив. Молодці і спасибі!
Девід Холл

9
Від анонімного користувача була пропозиція: "Коли ви включаєте Шлях до бібліотеки, переконайтеся, що ви вводите їх у лапки, якщо шлях має пробіли". Додаючи його як коментар, якщо це комусь допоможе.
iDev

2
Одним із додаткових способів включити статичну бібліотеку є, в рамках "проектних залежностей" рішення, налаштувати проект на залежність від статичної бібліотеки, до якої потрібно приєднатися. Мені потрібні віки, щоб зрозуміти, чому один із моїх проектів пов'язував правильно а іншого не було - ось чому.
Стюарт Вуд

3
Я хотів би зазначити, що використання "Додаткового включення каталогів" з каталогом вихідних файлів іншого проекту може бути жахливою ідеєю. Інший проект може мати файли з однаковими іменами (дуже ймовірно, якщо ви використовуєте заздалегідь складені заголовки для кожного). Особисто я вважаю за краще додати батьківську папку вихідних файлів проектів, щоб ви могли принаймні вказати себе, наприклад #include "proj2\include.h". Маючи декілька проектів на рішення, схоже, дуже спрямоване на мови NET, оскільки вони використовуються дуже по-різному. Але все ж знайти чудовий спосіб подолати це для проектів C ++.
Deji

18
Це трохи нерозумно. VS може зробити це багато автоматично. Важко повірити, що немає кращого рішення порівняно із жорстким кодуванням налаштування залежності проекту - тощо.
Cookie

4

#includeне має нічого спільного з проектами - він просто повідомляє препроцесору "помістити вміст файлу заголовка сюди". Якщо ви дасте йому шлях, який вказує на правильне розташування (може бути відносним шляхом, наприклад ../your_file.h), він буде включений правильно.

Однак вам доведеться дізнатися про бібліотеки (статичні / динамічні бібліотеки) для того, щоб такі проекти правильно пов'язувались - але це вже інше питання.


3

Оскільки обидва проекти знаходяться в одному і тому ж рішенні, існує більш простий спосіб включити файли та посилання, як описано в https://docs.microsoft.com/en-us/cpp/build/adding-references-in-visual-cpp- проекти? view = vs 2019 :

  1. Включити можна записати у відносному шляху (наприклад #include "../libProject/libHeader.h").
  2. Для лінкера клацніть правою кнопкою миші «Посилання», Клацніть на Додати довідку та виберіть інший проект.

Хороший і простий, але дуже поганий, відносний шлях потрібен скрізь, де ви включаєте заголовок.
yoyo

2

Потрібно встановити шлях до заголовків у властивостях проекту, щоб компілятор шукав там, коли намагався знайти файли заголовків. Я не можу згадати точне місце, але дивіться, хоча властивості Проекту, і ви повинні його бачити.


Розташування може бути в розділі Властивості> C / C ++> Загальне> Додаткові включення каталогів.
Мустафа Кемаль

0

Постарайтеся уникати повних посилань на шлях у директиві #include, будь то абсолютні чи відносні. Натомість додайте розташування папки включення іншого проекту у налаштування вашого проекту. Використовуйте лише підпапки в посиланнях на шляхи, коли це необхідно. Таким чином, простіше переміщувати речі, не потребуючи оновлення коду.


0

Розширюючись на відповідь @ Бенава, моїм кращим підходом є:

  1. Додайте каталог рішень до шляхів включення:
    • клацніть правою кнопкою миші на вашому проекті в Провіднику рішень
    • виберіть Властивості
    • виберіть Усі конфігурації та Усі платформи зі спадних меню
    • виберіть C / C ++> Загальне
    • додати $(SolutionDir)до додаткових каталогів включення
  2. Додайте посилання на кожен проект, який ви хочете використовувати:
    • клацніть правою кнопкою миші на посилання вашого проекту в Провіднику рішень
    • виберіть Додати довідку ...
    • виберіть проект (и), на який ви хочете звернутися

Тепер ви можете включити заголовки від своїх посилань на такі проекти:

#include "OtherProject/Header.h"

Примітки:

  • Це передбачає, що ваш файл рішення зберігається по одній папці в кожному з ваших проектів, що є організацією за замовчуванням при створенні проектів за допомогою Visual Studio.
  • Тепер ви можете включити будь-який файл із шляху відносно папки рішення, що може бути не бажаним, але для простоти підходу я з цим все в порядку.
  • Крок 2 не потрібен #includes, але він встановлює правильні залежності побудови, яких ви, мабуть, хочете.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.