如何包括使用软链接的工作
how does include work with soft links?
我想知道当包含或includee在同一目录中仅与软链接相同时,引用包含会发生什么。
想象三个标题a
,b
和c
,以及一个目录d
。a
和b
在CWD中,c
在d
下。现在想象一下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(是实现定义(除此之外如果前者失败的话,前者将落在后者上(,这意味着必须由您的编译器供应商确定并记录。因此,尽管肯定有共同的惯例,但它几乎是"它如何在您的计算机上工作"。我希望相同的指导搜索在包含符号链接的目录中,因为必须采取积极的行动才能执行。
- 我似乎无法让 msvc 链接器在 vscode 上正常工作
- 在调试配置中编译工作正常,但发布会给出链接错误
- 当我在C 程序中加入RINSIDE标头时,如何使链接器工作
- 重载按位 OR('|'),用于链接操作无法按预期工作
- 如何包括使用软链接的工作
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 如何使用字符串更改此插入功能以在链接列表中工作
- MySql connector-c++不会在QtCreator中链接,但在Raspberry pi3上本地工作正常
- 如何设计一个配置实用程序来静态和动态链接工作
- 如何使此链接列表正常工作
- 模板隐式专业化和链接,它是如何工作的?
- 针对库链接但直接传递obj文件的未解析名称可以正常工作
- 动态链接是如何工作的,它的用法以及如何以及为什么要制作dylib
- 链接究竟是如何工作的
- 文件之间的链接 - 它究竟是如何工作的
- 无法使用VS2012链接到静态升压库,而动态链接工作正常
- 链接错误(#ifndef 无法按预期工作)
- 如何在C/C++中以编程方式创建软链接
- MS链接从gnu-make失败,但从cmd行工作
- 双链接列表停止工作