2010-08-16 23 views
11

Używam projektu Visual Studio 2008 C++ (Visa 32-bitowy).Kompilator nie śledzący dowiązań symbolicznych w programie Visual Studio C++

Mam następującą dyrektywę #include w moim kodzie źródłowym.

#include <example/header.h> 

W moim zawierać ścieżkę określić katalog nadrzędny 'przykład', tj

C:/.../include 

gdzie pełną ścieżkę do nagłówka wygląda

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

Jednak " przykład "to symboliczny link (A" .lnk "utworzony za pomocą nowego" skrótu "pliku). I pojawia się następujący błąd

c: ... \ foo.cpp (37): fatal error C1083: Can not open obejmują pliku: 'example/header.h': Nie ma takiego pliku lub katalogu

Jeśli I zamieni dowiązanie symboliczne na rzeczywisty katalog, projekt zostanie skompilowany poprawnie. Ze względów praktycznych potrzebuję, aby był to symboliczny link. Czy mimo to proces wstępnego przetwarzania Visual Studio odbywa się za pomocą łącza?

+1

Aby opis twojego pytania był nieco bardziej przejrzysty, możesz chcieć zmienić "przykład.h" na "nagłówek.h" lub coś w tym stylu, tak jak później odwołasz się do "przykładu", więc początkowo jest to trochę trudne. – Cam

+0

@Cam: Gotowe. Próbowałem ponownie sformułować pytanie, aby było bardziej czytelne. – Akusete

+0

Znacznie lepiej;) ... Jeśli przejdziesz do "przykładu" z pulpitu, czy działa poprawnie? Ponadto używasz rzeczywistego "dowiązania symbolicznego" lub używasz "skrzyżowania"? (to ostatnie pytanie może wydawać się bez sensu/oczywiste, ale chcę się tylko upewnić). – Cam

Odpowiedz

10

Link jest łączem symbolicznym (.lnk)

Czy jesteś pewien, że nie tworzysz skrót? Skróty działają na wyższym poziomie niż łącza symboliczne i nic nie znaczą dla aplikacji.

Odwrotnie, dowiązania symboliczne (jeśli są prawidłowo utworzone) powinny działać dobrze z każdą aplikacją czytającą/zapisującą pliki/foldery.

Aby uzyskać więcej informacji, możesz rozważyć przeczytanie tego article about symbolic links, który wyjaśnia, jak utworzyć dowiązanie symboliczne za pomocą mklink.

Oto pomocny fragment z komentarzem na temat tego artykułu przez „Bernard Kerckenaere”:

  • skrót: na poziomie systemu operacyjnego (do zastosowań, które chcą odczytu/zapisu link, to tylko plik znaczenia)

  • miękki Link (lub link symboliczny): jak skrót, ale na poziomie plików (aplikacje czytanie/pisanie link , rzeczywiście odczytu/napisz plik połączony z) ... to będzie działać w całej partycji lub dysków

  • twrdym: tylko dla plików, co się dzieje, jest to, że istnieje wiele wpisów plików, które wskazują na ten sam danych fizycznych, po usunięciu jednego wejście, drugi woli nadal działa, dane nie zostaną usunięte, dopóki wszystkie wpisy nie zostaną usunięte (jeśli z użyciem miękkiego łącza usuniesz usuń oryginalny katalog, link nie będzie już działał!) -> możesz oczywiście tworzyć tylko twarde linki do pliku na tej samej partycji

To, co chcesz utworzyć, to symboliczne łącze , które można wykonać za pomocą parametruza pomocą mlink.

+0

Ahh ... Nie mam zbyt wielu okien do rozwoju. Jestem zaskoczony 'ln -s', w cygwin utworzyłem plik ".lnk" – Akusete

+0

Przesyłam projekt linuxowy do windowsa, a skrypt generuje odnośniki do plików nagłówkowych za pomocą 'ln -s', który na Cygwin utworzył skróty zamiast rzeczywistych symboliczne linki – Akusete

+0

@Akusete: Ah - to denerwujące. Nie jestem bardzo zaznajomiony z * nix development lub cygwin (chociaż pracuję nad naprawianiem tego!), Ale nie sądzę, że możesz łatwo stworzyć dowiązanie symboliczne poprzez cygwin. Czy możesz po prostu zastąpić instancje ln -s wywołaniami mklink? – Cam

1

.lnk nie jest dowiązaniem symbolicznym, jest to plik skrótu do Eksploratora. Aby utworzyć dowiązania, użyj

fsutil hardlink create link_name file_name 

na Vista, nie ma mklink narzędzie do tworzenia łączy symbolicznych.

0

Starsze wersje Visual Studio są nieco skomplikowane, jeśli chodzi o dowiązania symboliczne. Twarde linki na plikach przy użyciu parametru \H prawie nigdy nie działają, ale dowiązanie symboliczne całych katalogów przy użyciu \D jest zwykle w porządku. Następnie może być konieczne usunięcie i ponowne dodanie folderu do projektu i do niego.