编译器不遵循 Visual Studio C++ 中的符号链接

Posted

技术标签:

【中文标题】编译器不遵循 Visual Studio C++ 中的符号链接【英文标题】:Compiler not following symbolic links in Visual Studio C++ 【发布时间】:2010-08-16 04:52:49 【问题描述】:

我正在使用 Visual Studio 2008 C++ 项目(Visa 32 位)。

我的源代码中有以下 #include 指令。

#include <example/header.h>

在我的包含路径中,我指定了'example'的父目录,即

C:/.../include

标题的完整路径如下所示

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

但是,“示例”是一个符号链接(通过文件资源管理器“新快捷方式”创建的“.lnk”)。我收到以下错误

c:...\foo.cpp(37) : 致命错误 C1083: 无法打开包含文件: 'example/header.h': 没有这样的文件或目录

如果我将符号链接替换为实际目录,项目将正确编译。出于实际原因,我需要它是一个符号链接。有没有办法让 Visual Studio 预处理器跟随链接?

【问题讨论】:

为了让您的问题描述更清楚一点,您可能需要将“example.h”更改为“header.h”或其他内容,因为您稍后会引用“example”,所以起初它有点很难跟上。 @Cam:完成。我试图重新措辞这个问题,使其更清晰。 好多了 ;) ...如果您从桌面浏览到example,它可以正常工作吗?另外,您使用的是实际的“符号链接”,还是使用“连接”? (最后一个问题可能看起来毫无意义/显而易见,但我只是想确定一下) @Cam:通过文件资源管理器查看符号链接可以正常工作。该链接是一个符号链接(.lnk),我什至不知道什么是联结,直到我刚刚查找它:)。 @Akusete:我刚刚测试过,它似乎对我来说很好用。您是如何创建符号链接的? 【参考方案1】:

链接是符号链接(.lnk)

您确定您没有创建快捷方式吗?快捷方式在比符号链接更高的层次上工作,对应用程序没有任何意义。

相反,符号链接(如果创建得当)应该适用于任何读取/写入文件/文件夹的应用程序。

有关更多详细信息,您不妨考虑阅读此article about symbolic links,其中解释了如何使用mklink 创建符号链接。

这是“Bernard Kerckenaere”对那篇文章的评论中的一个有用的 sn-p:

快捷方式:在操作系统级别(适用于希望 读/写链接,它只是一个 无意义的文件)

软链接(或符号链接):类似于快捷方式,但在文件系统级别 (应用程序读/写 链接,实际上会读/写 文件链接) ... 这将适用于分区或驱动器

硬链接:仅适用于文件,发生的情况是有多个 指向相同的文件条目 物理数据,当你删除一个 进入,另一个仍然可以工作, 数据不会消失,直到所有条目 被删除(如果您使用软链接 删除原目录, 链接失效了!) -> 你显然只能创建指向同一分区上文件的硬链接

您要创建的是一个符号链接,您可以使用 mlink 使用 /D 参数来创建它。

【讨论】:

啊...我不经常使用 Windows 进行开发。我很惊讶 'ln -s',在 cygwin 中创建了一个 '.lnk' 文件 我正在将一个 linux 项目移植到 windows 并且脚本使用 'ln -s' 生成头文件链接,它在 cygwin 上创建了快捷方式而不是实际的符号链接 @Akusete:啊——这很烦人。我对 *nix 开发或 cygwin 并不十分熟悉(尽管我正在努力解决这个问题!),但我认为您不能通过 cygwin 轻松创建符号链接。你能用调用 mklink 来替换 ln -s 实例吗?【参考方案2】:

.lnk 不是符号链接,它是资源管理器的快捷方式文件。 要创建硬链接,请使用

fsutil hardlink create link_name file_name

在 Vista 上,有 mklink 实用程序来创建符号链接。

【讨论】:

【参考方案3】:

旧版本的 Visual Studio 在符号链接方面有点挑剔。使用\H 参数的文件硬链接几乎不起作用,但使用\D 符号链接整个目录通常没问题。之后,您可能需要从项目中删除并重新添加该文件夹。

【讨论】:

以上是关于编译器不遵循 Visual Studio C++ 中的符号链接的主要内容,如果未能解决你的问题,请参考以下文章

如何只用visual c++编译器而不安装visual studio

我可以在 Visual Studio 2012 中编译和调试(运行)单个 C++ 文件吗? (如何避免创建太多项目)

Visual Studio 2005 C++ 编译器比 Visual Studio 6 编译器慢?

microsoft visual c++里的编译在哪里?

在不安装 Visual Studio 的情况下使用 Microsoft C++ 编译器

C++ Visual Studio 编译错误