最近倒腾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