Rexdf

The devil is in the Details.

Win10SDK的头文件问题

| Comments

起因是在Win10上面ycmd补全Windows的头文件没有Win8.1的全了,最明显的就是一堆idl文件没有了。然后我折腾了一会ycm_extra_conf.py,发现问题的关键在于clang上。

clang是我自己从源码编译3.8.0版本。执行clang -v -E -x c++ -得如下内容:

commandMyBlog
X:\llvim3.8.0\bin>clang -v -E -x c++ -
clang version 3.8.0 (trunk 246839)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: X:\llvim3.8.0\bin
"X:\\llvim3.8.0\\bin\\clang.exe" -cc1 -triple x86_64-pc-windows-msvc18.0.0 -E -disable-free -disable-llvm-verifier -main-file-name - -mrelocation-model pic -pic-level 2 -mthread
-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -momit-leaf-frame-pointer -v -dwarf-column-info -resource-dir "X:\\llvim3.8.0\\bi
n\\..\\lib\\clang\\3.8.0" -internal-isystem "X:\\llvim3.8.0\\bin\\..\\lib\\clang\\3.8.0\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\in
clude" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\um" -internal-isystem "C:\\Progr
am Files (x86)\\Windows Kits\\10\\include\\winrt" -fdeprecated-macro -fdebug-compilation-dir "X:\\llvim3.8.0\\bin" -ferror-limit 19 -fmessage-length 189 -mstackrealign -fms-exten
sions -fms-compatibility -fms-compatibility-version=18 -std=c++11 -fno-threadsafe-statics -fdelayed-template-parsing -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o - -x
c++ -
clang -cc1 version 3.8.0 based upon LLVM 3.8.0svn default target x86_64-pc-windows-msvc
ignoring nonexistent directory "C:\Program Files (x86)\Windows Kits\10\include\shared"
ignoring nonexistent directory "C:\Program Files (x86)\Windows Kits\10\include\um"
ignoring nonexistent directory "C:\Program Files (x86)\Windows Kits\10\include\winrt"
#include "..." search starts here:
#include <...> search starts here:
X:\llvim3.8.0\bin\..\lib\clang\3.8.0\include
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include
End of search list.

去Windows Kits目录里面一看,发现C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\shared这个目录才是对的。

蹭蹭地跑去llvm社区maillist求助,得到修改clang/lib/Driver/MSVCToolChain.cpp的提示,看来下,要做似乎挺简单。然而我习惯每天更新llvm源码,哪天心情不好就会重新编译,所以改源码似乎不是上策。于是想到了linux每天都做的事情,ln -s啊!

新建快捷方式,复制进去。不行依然找不到。

然后依稀记得以前见过NTFS的硬链接和软连接。于是问题迎刃而解了。具体方法参考这里

下载Junction,然后junction shared 10.0.10240.0\shared即可,对另外五个目录同样方法。

再次测试

commandMyBlog
X:\\llvim3.8.0\bin>clang -v -E -x c++ -
clang version 3.8.0 (trunk 246839)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: X:\llvim3.8.0\bin
"X:\\llvim3.8.0\\bin\\clang.exe" -cc1 -triple x86_64-pc-windows-msvc18.0.0 -E -disable-free -disable-llvm-verifier -main-file-name - -mrelocation-model pic -pic-level 2 -mthread
-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -momit-leaf-frame-pointer -v -dwarf-column-info -resource-dir "X:\\llvim3.8.0\\bi
n\\..\\lib\\clang\\3.8.0" -internal-isystem "X:\\llvim3.8.0\\bin\\..\\lib\\clang\\3.8.0\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\in
clude" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\um" -internal-isystem "C:\\Progr
am Files (x86)\\Windows Kits\\10\\include\\winrt" -fdeprecated-macro -fdebug-compilation-dir "X:\\llvim3.8.0\\bin" -ferror-limit 19 -fmessage-length 189 -mstackrealign -fms-exten
sions -fms-compatibility -fms-compatibility-version=18 -std=c++11 -fno-threadsafe-statics -fdelayed-template-parsing -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o - -x
c++ -
clang -cc1 version 3.8.0 based upon LLVM 3.8.0svn default target x86_64-pc-windows-msvc
#include "..." search starts here:
#include <...> search starts here:
X:\llvim3.8.0\bin\..\lib\clang\3.8.0\include
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include
C:\Program Files (x86)\Windows Kits\10\include\shared
C:\Program Files (x86)\Windows Kits\10\include\um
C:\Program Files (x86)\Windows Kits\10\include\winrt
End of search list.

然后ycmd就可以在Windows上面补全Win10 Kits的头文件了。

补充:

刚刚发现实际上mklink可以干同样的事情。

Windows里面“连接”分四种:硬链接(Hard link)、联接(针对目录,Directory Junction)、符号连接(symbolic link)、快捷方式(Shortcut).前三种对应于mklink的三种参数 /h /j /d 。而且mklink是vista以后系统自带的。这样就方便很多了。对于本文的问题用 mklink /j 即可。

而广为人知的快捷方式,实际上是*.lnk文件,它内容就是网址或者文件地址(还可以包括快捷方式图标等文本信息),有大小的一个文本文件,在Windows的文件API上面做了透明处理。似乎没有办法通过普通文本编辑器打开lnk文件而不跳转到它连接的文件。这就是可以把快捷方式到处拷贝剪切和改名。

而硬链接、联接和符号连接属于NTFS文件系统底层一些的级别的。

而通过右键属性观察,符号连接和快捷方式几乎一样。区别就是快捷方式可以拷贝到Fat32的优盘,而符号链接则只能存在NTFS文件系统上。

Comments