Компилятор не следует по символическим ссылкам в Visual Studio C ++ - PullRequest
11 голосов
/ 16 августа 2010

Я использую проект Visual Studio 2008 C ++ (Visa 32 bit).

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

#include <example/header.h>

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

C:/.../include

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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 16 августа 2010

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

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

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

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

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

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

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

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

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

1 голос
/ 16 августа 2010

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

fsutil hardlink create link_name file_name

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

0 голосов
/ 02 марта 2016

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

...