visual c ++: # включать файлы из других проектов в одно решение

113

Я работаю над игрой на Visual C ++. У меня есть некоторые компоненты в отдельных проектах, и я установил зависимости проекта. Как мне # включить файл заголовка из другого проекта? Понятия не имею, как использовать классы из одного проекта в другом.

rlbond
источник

Ответы:

200

Настройки для компилятора

В проекте, в который вы хотите # включить файл заголовка из другого проекта, вам нужно будет добавить путь к файлу заголовка в раздел Дополнительные подключаемые каталоги в конфигурации проекта.

Чтобы получить доступ к конфигурации проекта:

  1. Щелкните проект правой кнопкой мыши и выберите "Свойства".
  2. Выберите Configuration Properties-> C / C ++ -> General.
  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. Выберите Configuration Properties-> Linker-> Input.
  3. Войдите в библиотеку в разделе "Дополнительные зависимости".
ЛеопардКожаТаблеткашляпа
источник
6
Могу я просто сказать, что после утреннего чтения ответов на эту тему на SO, ваши самые ясные и исчерпывающие, с которыми я когда-либо сталкивался. Молодцы и спасибо!
Дэвид Холл
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. Для компоновщика щелкните правой кнопкой мыши «Ссылки», нажмите «Добавить ссылку» и выберите другой проект.
Бенав
источник
Красиво и просто, но жаль, что относительный путь нужен везде, где вы включаете заголовок.
йойо,
2

Вам необходимо указать путь к заголовкам в свойствах проекта, чтобы компилятор смотрел туда при попытке найти файл (ы) заголовка. Я не могу вспомнить точное местоположение, но посмотрите свойства проекта, и вы должны его увидеть.

Росстифицированный
источник
Расположение можно найти в разделе «Свойства»> «C / C ++»> «Общие»> «Дополнительные каталоги включения».
Мустафа Кемаль,
0

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

cdonner
источник
0

Расширяя ответ @Benav, я предпочитаю:

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

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

#include "OtherProject/Header.h"

Ноты:

  • Это предполагает, что ваш файл решения хранится на одну папку выше каждого из ваших проектов, что является организацией по умолчанию при создании проектов с помощью Visual Studio.
  • Теперь вы можете включить любой файл из пути относительно папки решения, что может быть нежелательно, но для простоты подхода я согласен с этим.
  • Шаг 2 не требуется для #includes, но он устанавливает правильные зависимости сборки, которые вы, вероятно, захотите.
йо Йо
источник