Windows下編譯YouCompleteMe流程[和ubuntu 32bit]

廢話

生命在于折騰悼枢。

之前不用這個插件的原因:

  • 因為要使這個插件起作用锄开,前前后后需要下載幾百MB(win下更是超過了1GB)的東西博助,包括了Clang編譯器蚓庭,ycmd的c艸源碼還有ycm本身的vim script见转,也就是說我安裝這個插件比一個IDE的體積還大命雀。

  • 另外一個原因就是就是Windows下使用安裝插件及其麻煩,這樣的話就有可能無法保持相同體驗斩箫,還不如不要算了吏砂。

現(xiàn)在為什么使用呢?第一句話。

熟悉之后感覺前面的折騰還是非常值得的乘客,體驗接近ide了狐血,ycm不僅提供了語義級別的智能補全,還提供了函數(shù)定義跳轉(zhuǎn)易核,而所有這些都是非常迅速不會導致vim變卡匈织。

編譯流程


主要參考官方wiki中的這一部分Instructions for 64-bit using MinGW64 clang

這短短的幾句話忽略了大量的細節(jié)牡直,如果是新手的話相信是很難搞得定的缀匕。所以我來細化它。

編譯環(huán)境——MSYS2


MSYS2是作為MinGw的替代者出現(xiàn)的碰逸,它的出現(xiàn)可以說結(jié)束了Windows下模擬Linux環(huán)境混亂的局面乡小,它移植來自Arch Linux中強大的包管理器:pacman。我們通過pacman來安裝其它東西饵史,比如說MinGw(目的在于提供編譯WIndows本地程序的工具集)满钟,git(我們再也不需要裝一個msysgit然后再裝一個MinGw了)。

這是一篇較為詳細的對比:Cygwin 與 MinGW/MSYS/MSYS2胳喷,如何選擇湃番?

官方對比How does MSYS2 differ from Cygwin

Cygwin的話,我的理解吭露,它提供接口更加兼容POSIX吠撮,在win api和應用之間加了一層兼容層(cygwin1.dll,所以由Cygwin的gcc編譯出來的應用程序在效率是輸給MinGw)的讲竿,所以在win下編譯unix下開源軟件泥兰,首選是MinGw择浊,你可以看到好多IDE(CodeBlock,QT等)其實包含了MinGW逾条。

官網(wǎng):msys2琢岩,下載對應平臺的exe安裝好之后,在開始菜單打開MSYS2 Shell师脂,你還會發(fā)現(xiàn)另外兩個快捷方式MinGW-W64 win64 ShellMinGW-W64 win32 Shell担孔,不過現(xiàn)在它們還打不開。

$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime

執(zhí)行完畢之后吃警,關閉Shell糕篇,重新打開。

$ pacman -Su #更新其它組件到最新..

關閉重打開酌心,更換pacman的源拌消。

$ cd /etc/pacman.d
$ gvim -p mirrorlist.mingw32  mirrorlist.mingw64  mirrorlist.msys #你在文件瀏覽器打開這個路徑然后用其它編輯器,這里只是示意而已.

然后在這三個文件最開頭分別添加一行(按照上面的順序)
Server = http://mirrors.ustc.edu.cn/msys2/REPOS/MINGW/i686
Server = http://mirrors.ustc.edu.cn/msys2/REPOS/MINGW/x86_64
Server = http://mirrors.ustc.edu.cn/msys2/REPOS/MSYS2/$arch

# 安裝以下東西..
pacman -Sy
pacman -S  mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb mingw-w64-x86_64-make tmux zsh git  mingw64/mingw-w64-x86_64-cmake winpty-git 

解釋下安券,第一個是編譯器墩崩,第二個是調(diào)試器,第三個工程管理工具make侯勉,后面兩個是文本三巨頭之二鹦筹,在后來是版本管理神器,cmake則是很受歡迎的新一代工程管理工具也是我們編譯YCM需要的工具,最后一個是解決mintty下有些工具卡死沒有輸出的情況的工具址貌。

# winpty使用示例铐拐,這里直接調(diào)用python會卡死..
$ winpty python

mingw-w64相關默認安裝/mingw64下,所以在MSYS2 Shell下默認找不到gcc命令的练对,你可以將相關路徑添加到諸如/etc/profile遍蟋,.bashrc.zshrc這樣的文件中,也可以在win下面改Path變量螟凭。

但更直接的方式在打開前面提到的快捷方式MinGW-W64 win64 Shell虚青,注意別看錯打開win32的shell了。

pacman的基本使用

# 安裝新包
pacman -S <package_names|package_groups>
# 移除包
pacman -R <package_names|package_groups>
# 搜索包赂摆,支持正則搜索
pacman -Ss <name_pattern>

編譯一個64位的gvim/vim (非必須挟憔,你可以直接到官網(wǎng)下載安裝即可钟些,我有點強迫癥烟号,想保證兩者 都是64位的)


打開MinGW-W64 win64 Shell

VIM官網(wǎng)只提供了32位的程序政恍,按照上面的wiki我們需要編譯一個帶有python2特性的64位vim好來驗證我們是否安裝成功了汪拥。

這里可以使用我的編譯腳本和vim配置,從github上脫下之后篙耗,里面有一個build_vim.sh腳本用于編譯vim迫筑。

$ git clone https://github.com/tracyone/vim vim_conf && cd vim_conf 

在執(zhí)行這個腳本之前你需要宪赶,你需要編輯這個腳本最開頭宏定義,里面定義諸如安裝路徑脯燃,python安裝路徑搂妻,架構等..

其中有python2,python3,ruby,lua,tcl,perl等外部接口支持,注意把不需要的接口對應的變量注釋掉辕棚,否則會編譯失敗欲主。

去官網(wǎng)下載最新python2,并加入Path變量逝嚎,然后安裝扁瓢,然后修改下面幾個變量

# python2 support
PYTHON=/e/program_files/Python27
DYNAMIC_PYTHON=yes
PYTHON_VER=27
$ ./build_vim.sh all

上面那條命令會下載vim源代碼(接近800MB),并編譯gvim和vim最終打開文件管理器补君,你只需要雙擊install.exe然后再彈出的界面中輸入d就能完成最后的安裝了引几。另外,也拷貝了我的vimrc到vim安裝目錄下挽铁。所以首次打開時會自動安裝插件伟桅,請確保網(wǎng)絡通暢,由于需要安裝較多插件(并且包含了接近200MB的YCM插件)叽掘,請非常耐心等待贿讹。

安裝YCM(非編譯)

上面那一步順利完成的話已經(jīng)裝好,如果沒有就自己按照下面的方法來做够掠。

第一種方法:

"使用vim-plug插件來安裝ycm民褂,下面這句話加入你的vimrc然后重啟vim,執(zhí)行`:PlugInstall YouCompleteMe`
Plug 'Valloric/YouCompleteMe', { 'do': 'git submodule update --init --recursive'  }

第二種:你可以手動安裝YCM疯潭,執(zhí)行下面命令之后赊堪,將YouCompleteMe整個拷貝到vim插件管理器指定的路徑之下。

git clone https://github.com/Valloric/YouCompleteMe.git 
cd YouCompleteMe 
git submodule update --init --recursive

編譯YCM


打開MinGW-W64 win64 Shell竖哩。

首先你得下載一個編譯好的64位的LLVM with Clang Support的安裝包哭廉,奇怪的是官網(wǎng)只提供了32位的安裝包,一度我想用MinGw從源代碼編譯一個相叁,后來太多錯誤就放棄了遵绰,最后發(fā)現(xiàn)這個項目有提供64位的安裝包ClangOnWin

安裝到你想要安裝的地方增淹,這里我安裝到c:/LLVM椿访。

Windows路徑的變換:如果Windows路徑是"C:\Program Files\Vim",那么你需要用轉(zhuǎn)義符號轉(zhuǎn)義空格虑润,并改變斜杠的方向成玫,最后變成"C:/Program\ Files/Vim"。

$ cd <root of vim installed>/vimfiles/bundle/YouCompleteMe
$ mkdir build ;cd build
$ cmake -G "MSYS Makefiles" -DCMAKE_MAKE_PROGRAM=E:/msys64/mingw64/bin/mingw32-make.exe -DPATH_TO_LLVM_ROOT=C:/LLVM . E:/program_files/Vim/vimfiles/bundle/YouCompleteMe/third_party/ycmd/cpp
$ mingw32-make ycm_core

至此結(jié)束,要確保正常運行哭当,需要保證添加到Path環(huán)境變量中猪腕,在MSYS2 Shell中同樣需要保證這兩個路徑在Path變量中,否則會出現(xiàn)加載模塊的錯誤钦勘。

  • Python2所在路徑
  • mingw64/bin路徑
  • llvm所在路徑

也可以分別將相關的dll拷貝到YouCompleteMe/third_party/ycmd路徑下:libstdc++-6.dll,libwinpthread-1.dll,libclang.dlllibgcc_s_seh-1.dll陋葡。

使用教程和配置

使用YouCompleteMe對工程進行補全,需要為每個工程提供一個項目文件:.ycm_extra_conf.py彻采,主要指定的是編譯器的option脖岛,比如說連接的庫,庫路徑颊亮,頭文件路徑柴梆,宏定義,編譯器優(yōu)化標志等等终惑。

這里要介紹一個插件绍在,YCM-Generator,他能根據(jù)項目中Makefiles等文件生成對應的.ycm_extra_conf.py文件雹有。很多時候這東西是不錯的偿渡,但是某些情況還是不夠靈活,比如說如果Makefile里面是交叉編譯器的話,它不支持霸奕。

項目根目錄下打開vim并執(zhí)行:call GenYcm()(我的配置里面的函數(shù))溜宽。

另外一個插件ycm_simple_conf,這個插件需要編寫一個xml文件质帅,然后根據(jù)這個xml文件生成适揉,這樣的話就比較靈活點。

在每個項目的根目錄下編寫.ycm_simple_conf.xml文件煤惩。

<project type="c++">
    <include path="/home/local/libA/include"/>
    <include path="/home/local/libB/include"/>
    <include path="include"/>
    <include path="build"/>
</project>
這個函數(shù)是為插件YCM-Generator的寫的嫉嘀。
function! GenYCM()
    let l:cur_dir=getcwd()
    cd $VIMFILES/bundle/YCM-Generator
    :silent execute  ":!./config_gen.py ".l:cur_dir
    if v:shell_error == 0
        echom "Generate successfully!"
        :YcmRestartServer
    else
        echom "Generate failed!"
    endif
    exec ":cd ". l:cur_dir
endfunction

"下面三個映射是YCM提供函數(shù)跳轉(zhuǎn)功能
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap <leader>jl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>jf :YcmCompleter GoToDefinition<CR>

"由于Clang編譯器的限制,ycm跳轉(zhuǎn)功能有致命缺陷魄揉,無法跳到另外文件的函數(shù)定義上面
"所以我寫了YcmGotoDef函數(shù)加上插件a.vim剪侮,實現(xiàn)粗略的跳轉(zhuǎn),原理是當Ycm跳到對應函數(shù)
"聲明的頭文件時使用a.vim的功能跳到對應源文件洛退,在使用正則搜索瓣俯,跳到函數(shù)定義上面。
nnoremap <leader>jg :call YcmGotoDef()<cr>

func! YcmGotoDef()
    let l:cur_word=expand("<cword>")."\s*\(.*[^;]$"
    :redir => l:msg
    execute ":YcmCompleter GoToDefinition"
    :redir END
    let l:rs=split(l:msg,'\r\n\|\n')
    "make sure index valid
    if get(l:rs,-1,3) !=3  && l:rs[-1] =~ 'Runtime.*'
        :redir => l:msg
        execute ":YcmCompleter GoToDeclaration"
        :redir END
        let l:rs=split(l:msg,'\r\n\|\n')
        if get(l:rs,-1,3) != 3 && l:rs[-1] !~ 'Runtime.*'
            execute ":silent! A"
            " search failed then go back
            if search(l:cur_word) == 0
                execute ":silent! A"
            endif
        endif
    endif
endfunc

"當tab補全時vim上面會分裂一個小窗口顯示函數(shù)變量原型兵怯,我們按下esc或者結(jié)束補全時
"自動關閉那個窗口
autocmd misc_group InsertLeave * if pumvisible() == 0|pclose|endif

let g:syntastic_always_populate_loc_list = 1
let g:ycm_confirm_extra_conf=0
let g:syntastic_always_populate_loc_list = 1
let g:ycm_semantic_triggers = {
  \   'c' : ['->', '    ', '.', ' ', '(', '[', '&'],
\     'cpp,objcpp' : ['->', '.', ' ', '(', '[', '&', '::'],
\     'perl' : ['->', '::', ' '],
\     'php' : ['->', '::', '.'],
\     'cs,java,javascript,d,vim,python,perl6,scala,vb,elixir,go' : ['.'],
\     'ruby' : ['.', '::'],
\     'lua' : ['.', ':']
\ }
let g:ycm_collect_identifiers_from_tag_files = 1
let g:ycm_filetype_blacklist = {
            \ 'tagbar' : 1,
            \ 'qf' : 1,
            \ 'notes' : 1,
            \ 'unite' : 1,
            \ 'text' : 1,
            \ 'vimwiki' : 1,
            \ 'pandoc' : 1,
            \ 'infolog' : 1,
            \ 'mail' : 1
            \}
let g:ycm_global_ycm_extra_conf = $VIMFILES . "/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"

關于.ycm_extra_conf.py的生成彩匕,最后我用ultisnips這個插件,自定義snippets摇零,生成.ycm_extra_conf.py的配置推掸,你可以參考
snippetspython.snippets的寫法。

ubuntu 32bit 安裝ycm流程

下面假設你已經(jīng)通過vim的vundle之類的插件管理器安裝好Ycm了驻仅。

編譯安裝clang編譯器到/opt/Clang

sudo update;sudo apt-get upgrade
sudo apt-get install g++ subversion cmake autoconf automake
cd ~;mkdir -p work/clang && cd work/clang
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../../
mkdir build && cd build
cmake ../llvm
cmake --build .
cmake -DCMAKE_INSTALL_PREFIX=/opt/Clang -P cmake_install.cmake

編譯ycm

cd ~/.vim/bundle/YouCompleteMe/
mkdir build
cd build
cmake -G "Unix Makefiles"   -DPATH_TO_LLVM_ROOT=/opt/Clang . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp && make ycm_core

其它

在Visual Studio編譯gvim和ycmd

ycm的github主頁上已經(jīng)提供了在vs下編譯ycmd的官方方法谅畅,詳細點這里

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市噪服,隨后出現(xiàn)的幾起案子毡泻,更是在濱河造成了極大的恐慌,老刑警劉巖粘优,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仇味,死亡現(xiàn)場離奇詭異,居然都是意外死亡雹顺,警方通過查閱死者的電腦和手機丹墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嬉愧,“玉大人贩挣,你說我怎么就攤上這事∶缓ǎ” “怎么了王财?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裕便。 經(jīng)常有香客問我绒净,道長,這世上最難降的妖魔是什么偿衰? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任挂疆,我火速辦了婚禮,結(jié)果婚禮上下翎,老公的妹妹穿的比我還像新娘囱嫩。我一直安慰自己,他們只是感情好漏设,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布墨闲。 她就那樣靜靜地躺著,像睡著了一般郑口。 火紅的嫁衣襯著肌膚如雪鸳碧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天犬性,我揣著相機與錄音瞻离,去河邊找鬼。 笑死乒裆,一個胖子當著我的面吹牛套利,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼肉迫,長吁一口氣:“原來是場噩夢啊……” “哼验辞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喊衫,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤跌造,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后族购,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壳贪,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年寝杖,在試婚紗的時候發(fā)現(xiàn)自己被綠了违施。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瑟幕,死狀恐怖醉拓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情收苏,我是刑警寧澤亿卤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站鹿霸,受9級特大地震影響排吴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懦鼠,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一钻哩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肛冶,春花似錦街氢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馅笙,卻和暖如春伦乔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背董习。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工烈和, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皿淋。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓招刹,卻偏偏與公主長得像恬试,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疯暑,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容