如何使用软链接?

时间:2018-03-29 13:37:43

标签: c++ c

我想知道当包含或包含的引用包含在同一目录中时,仅作为软链接会发生什么。

想象一下三个标题,abc以及目录dab在CWD中,cd下。现在假设d下的软链接指向b(名为b)。

如果仅使用引用包含且c包含b包括aa将在目录d中搜索b,这是位置到b的软链接,或CWD中string folder = @"C:/Aatrox"; private void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { var fileName = (string)ListBox1.SelectedItem; textEditorControl1.Text = File.ReadAllText(Paht.Combine(folder, fileName)); } private void FlatButton3_Click(object sender, EventArgs e) { ListBox1.Items.Clear(); string[] txtfiles = Directory.GetFiles(folder, "*.txt"); string[] luafiles = Directory.GetFiles(folder, "*.lua"); foreach (var item in txtfiles) { ListBox1.Items.Add(Path.GetFileName(item)); } foreach (var item in luafiles) { ListBox1.Items.Add(Path.GetFileName(item)); } } 的实际物理位置?

我读过a page at MSDN,但我找不到明确的答案。 “与包含#include语句的文件相同的目录”是什么意思?

2 个答案:

答案 0 :(得分:2)

将文件搜索到#include"file"<file>:[cpp.include] / 2-3)的过程是实现定义的(除非前者在失败时退回后者),这意味着必须由编译器供应商决定并记录。所以它几乎是“它如何在[你的]计算机上运行”,尽管有一些共同的惯例。我希望同一目录搜索在包含符号链接的目录中,因为必须采取积极的行动。

答案 1 :(得分:1)

解决软链接的机制不考虑当前的工作目录,而是考虑链接的目录。让我演示一个更自然的例子,如果你试着阅读/usr/include/X11/Xlib.h(例如,这是编译器在linux中搜索<X11/Xlib.h>的地方之一),它会发生{ {1}}是/usr/include/X11的软链接,算法在解决所有路径组件后最终解析为../../opt/X11/include(或实际上/usr/include/../../opt/X11/include,与当前目录无关。当前或根目录是在您的u区域(专用于您的进程的操作系统资源的一部分)中保留的inode表条目,以便启动机制或将名称解析为inode条目任务,最终处理到inode您要打开的文件。这对编译器来说是透明的,所以尽管有人说它是实现定义的,但所有posix系统都有一个简单的机制来搜索最终文件的系统相关目录列表。但是,软链接机制是透明的,您不需要期望特殊的编译器行为。

编译器只考虑其当前工作目录的唯一时间是,如果您实际强制它执行,如:

/opt/X11/include

#include "./header.h"

修改

如果软链接指向文件(而不是目录),则显示此示例:

假设您的安装已将ncurses包含在#include "../../includes/myprojectheader.h" 中的一个子目录中(假设为ncurses),并且您想使用/usr/include,那么您已安排以下内容:

#include <ncurses.h>

您将拥有指向ln -s ncurses/curses.h curses.h 的文件/usr/include/curses.h的链接,然后当您打开ncurses/curses.h内核到达路径的最后一部分时/usr/include/curses.h )并且看到它是一个符号链接,因此它替换最后一部分(因为指向的链接不是绝对的)并用curses.h替换它,并打开文件ncurses/curses.h