如何包括使用软链接的工作

how does include work with soft links?

本文关键字:工作 软链接 何包括      更新时间:2023-10-16

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

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

如果仅使用引用,并且c包括b,其中包括a,将在目录d中搜索a,这是b的软链接的位置,或b的实际物理位置的位置,在CWD中?

我已经阅读了MSDN的页面,但是找不到明确的答案。"与包含#include语句的文件相同目录的含义"是什么?

求解软链接的机制未考虑当前工作目录,而是解决链接的目录。让我用一个更自然的例子演示,如果您尝试阅读/usr/include/X11/Xlib.h(例如,这是编译器将在Linux中搜索<X11/Xlib.h>的地方之一(,并且碰巧/usr/include/X11../../opt/X11/include的软链接,算法解析为/usr/include/../../opt/X11/include(或实际上/opt/X11/include,最后在求解所有路径组件之后(,与当前目录无关。当前或根目录是在U-AREA中保留的Inode表条目(专用于您的过程的操作系统资源的一部分(,以启动机制或将名称解析为Inode输入任务,最终将其交易到Inode。您要打开的文件。对于编译器而言,这是透明的,因此,尽管已经定义了实现,但所有POSIX系统都有一个简单的机制,即搜索最终文件的目录依赖性目录列表。但是软链路机制是透明的,您无需期望特殊的编译器行为。

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

#include "./header.h"

#include "../../includes/myprojectheader.h"

编辑

在此示例中显示了file的软链接指向文件(而不是目录(:

假设您的安装已将NCurses包含在/usr/include中的一个细胞中(例如ncurses(中,并且您想使用#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替换并打开文件/usr/include/ncurses/curses.h

搜索文件到 #include的过程(无论是 "file"还是 <file>:[cpp.include]/2-3(是实现定义(除此之外如果前者失败的话,前者将落在后者上(,这意味着必须由您的编译器供应商确定并记录。因此,尽管肯定有共同的惯例,但它几乎是"它如何在您的计算机上工作"。我希望相同的指导搜索在包含符号链接的目录中,因为必须采取积极的行动才能执行。