最近倒騰Linux C/C++項目。以目前的狀況來講,要生成編譯(build)一個Linux工程腳本,首選的工具一定是CMake。這也是我以前Linux項目的首選。不過自從VS IDE支持Linux C/C++開發後,也嘗試這經過一些小demo來體驗MS的解決方案。總得來講還能夠,可是有個大問題由於一直沒時間搞,就沒有深刻。工具
這裏經過一個假定的場景來講這個問題。ui
在VS Linux項目裏,若是一個解決方案下面有多個工程,比方說有兩個工程A(.out)和B(.so),當工程A依賴工程B時咱們須要設置工程的依賴關係,保證編譯工程A時能先把依賴庫編譯出來。設置方式以下圖:orm
設置完依賴關係後還要保證編譯A時可以連接到已經生成的libB.so。這須要在工程屬性頁裏Configuration Properties / Linker / Input : Libraries Dependencies里加上B。固然這還不夠,由於連接指定的是so的名字,並無指定so的路徑。因此,要找到so必須知道so文件在哪裏。除了使用絕對路徑外,更好的方案顯然是指定庫文件的目錄。正常狀況下,類庫文件都會統一編譯到一個指定的目錄下。blog
在VS的環境裏,本地$(SolutionDir)默認映射到遠程的$(RemoteRootDir)。而$(RemoteRootDir)默認是"~/projects"。因此若是統一將二進制文件編譯到$(SolutionDir)bin\$(Platform)\$(Configuration)的話,對應地,在遠程Linux上會被部署在"$(RemoteRootDir)/bin/$(Platform)/$(Configuration)"目錄下。因而經過屬性頁向Configuration Properties / Linker / General : Additional Library Directories添加"$(RemoteRootDir)/bin/$(Platform)/$(Configuration)"就從理論上解決了連接時-lB到哪裏找libB.so的問題了。可是,通過嘗試以後你會發現,這樣作並無解決連接時找不到libB.so的問題。ci
以前並無長期作Linux開發,因此對GCC編譯選項的使用也就主要花時間看了看各類警告選項。對於大小L的連接選項,也是同樣,只是知道是幹嗎,可是對於輸入字串的格式是否是有嚴格要求還真不知道。因而,我就遇到了本文要說的這個問題。只要Additional Library Directories裏的路徑是經過"~"來定位的,就必然會遇到VS環境下編譯時找不到庫文件的問題(固然我並不清楚在Linux上直接使用GCC編譯連接是否是會遇到一樣的問題)。開發
要解決這個問題,要麼向前文說的,使用絕對路徑。這顯然不是個好方法,特別是自定義的類庫比較多的時候。另一種方法是將"~"使用絕對路徑替換。也就是說將$(RemoteRootDir)的值從"~/projects"改成"/home/user_name/projects"。這就得保證在多個機器上使用VS遠程編譯時機器上的用戶名都是同一個,否則要不停地改,也是做孽。部署
其實最好的方法是將$(RemoteRootDir)改成"$HOME/projects"。it
完~io