Компилятор не следит за символическими ссылками в Visual Studio С++

Я использую проект Visual Studio 2008 С++ (виза 32 бит).

У меня есть следующая директива #include в моем исходном коде.

#include <example/header.h>

В моем пути включения я указываю родительский каталог примера, т.е.

C:/.../include

где полный путь к заголовку выглядит как

C:/.../include/example/header.h

Однако "пример" - это символическая ссылка (A '.lnk', созданная с помощью нового ярлыка "проводник" ). Я получаю следующую ошибку:

c:...\foo.cpp(37): фатальная ошибка C1083: невозможно открыть файл include: 'example/header.h': нет такого файла или каталога

Если я заменить символическую ссылку на фактический каталог, проект будет скомпилирован правильно. По практическим соображениям мне нужно, чтобы это была символическая ссылка. Есть ли способ заставить предварительный процессор Visual Studio следовать по ссылке?

Ответ 1

Ссылка является символической ссылкой (.lnk)

Вы уверены, что не создаете ярлык? Ярлыки работают на более высоком уровне, чем символические ссылки, и ничего не значат для приложений.

И наоборот, символические ссылки (если они правильно созданы) должны отлично работать с любым приложением, которое читает/записывает файлы/папки.

Для более подробной информации вы можете рассмотреть возможность чтения этой статьи о символических ссылках, в которой объясняется, как вы можете создать символическую ссылку, используя mklink.

Вот полезный фрагмент из комментария к этой статье "Bernard Kerckenaere":

  • ярлык: на уровне операционной системы (для приложений, которые хотят читать/писать ссылку, ее просто бессмысленный файл)

  • soft link (или символическая ссылка): как ярлык, но на уровне файловой системы (приложения, которые читают/записывают ссылка, на самом деле будет читать/писать файл связан с)... это будет работать через разделы или диски

  • жесткая ссылка: только для файлов, происходит то, что есть несколько которые указывают на то же самое физические данные, когда вы удаляете один другой, все еще будет работать, данные не исчезнут до тех пор, пока все записи (если с помощью мягкой ссылки вы удалить исходный каталог, ссылка больше не будет работать!) → вы можете явно создавать жесткие ссылки на файл в том же разделе

То, что вы хотите создать, это символическая ссылка, которую вы можете сделать с параметром /D, используя mlink.

Ответ 2

.lnk не является символической ссылкой, это ярлык для Explorer. Чтобы создать жесткую ссылку, используйте

fsutil hardlink create link_name file_name

В Vista существует утилита mklink для создания символических ссылок.

Ответ 3

Старые версии Visual Studio немного сложны, когда дело доходит до символических ссылок. Жесткие ссылки на файлы с использованием параметра \H почти никогда не работают, но символическая ссылка на все каталоги с помощью \D обычно прекрасна. Впоследствии вам может потребоваться удалить и повторно добавить папку из и в ваш проект.