解决Visual C++ for Linux: -L"~/projects/path_to_lib_folder" 无法设置library search path的问题
最近倒腾Linux C/C++项目。以目前的情况来说,要生成编译(build)一个Linux工程脚本,首选的工具必定是CMake。这也是我之前Linux项目的首选。不过自从VS IDE支持Linux C/C++开发后,也尝试这通过一些小demo来体验MS的解决方案。总得来说还可以,但是有个大问题因为一直没时间搞,就没有深入。
这里通过一个假定的场景来说这个问题。
在VS Linux项目里,如果一个解决方案下面有多个工程,比方说有两个工程A(.out)和B(.so),当工程A依赖工程B时我们需要设置工程的依赖关系,保证编译工程A时能先把依赖库编译出来。设置方式如下图:

设置完依赖关系后还要保证编译A时能够链接到已经生成的libB.so。这需要在工程属性页里Configuration Properties / Linker / Input : Libraries Dependencies里加上B。当然这还不够,因为链接指定的是so的名字,并没有指定so的路径。所以,要找到so必须知道so文件在哪里。除了使用绝对路径外,更好的方案显然是指定库文件的目录。正常情况下,类库文件都会统一编译到一个指定的目录下。
在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的问题。
之前并没有长期做Linux开发,所以对GCC编译选项的使用也就主要花时间看了看各种警告选项。对于大小L的链接选项,也是一样,只是知道是干嘛,但是对于输入字串的格式是不是有严格要求还真不知道。于是,我就遇到了本文要说的这个问题。只要Additional Library Directories里的路径是通过"~"来定位的,就必然会遇到VS环境下编译时找不到库文件的问题(当然我并不清楚在Linux上直接使用GCC编译链接是不是会遇到同样的问题)。
要解决这个问题,要么向前文说的,使用绝对路径。这显然不是个好方法,特别是自定义的类库比较多的时候。另外一种方法是将"~"使用绝对路径替换。也就是说将$(RemoteRootDir)的值从"~/projects"改为"/home/user_name/projects"。这就得保证在多个机器上使用VS远程编译时机器上的用户名都是同一个,不然要不停地改,也是作孽。
其实最好的方法是将$(RemoteRootDir)改为"$HOME/projects"。
完~
解决Visual C++ for Linux: -L"~/projects/path_to_lib_folder" 无法设置library search path的问题的更多相关文章
- Visual C++ for Linux Development
原文 https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/ Visual C++ fo ...
- MonoDevelop with Visual Studio to Linux and Mac OSX maintaining a single code base for all platforms.
Home | Screenshots | Download | Contact | FAQ | Documentation | Development | Search MonoDevelop i ...
- 使用Visual VM 查看linux中tomcat运行时JVM内存
前言:在生产环境中经常发生服务器内存溢出,假死或者线程死锁等异常,导致服务不可用.我们经常使用的解决方法是通过分析错误日记,然后去寻找代码到底哪里出现了问题,这样的方式也许会奏效,但是排查起来耗费时间 ...
- visual studio 开发linux程序
VisualGDB支持Linux的原理是,通过ssh连接到Linux系统上通过ssh给linux下达命令 . (类似visualgdb的有windgb ,这2个都是商业软件.) Visual GDB ...
- Visual Studio® 2010 Web Deployment Projects站点编译生成bin同时发表插件
VS2010环境下: 1.Visual Studio® 2010 Web Deployment Projects下载地址: http://www.microsoft.com/downlo ...
- 解决Qt程序在Linux下无法输入中文的办法
解决Qt程序在Linux下无法输入中文的办法 一位网友问我怎样在Linux的Qt的应用程序中输入中文,我一開始认为不是什么问题,可是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...
- 解决 Visual Studio 符号加载不完全问题
解决 Visual Studio 符号加载不完全问题 工具 - 选项 - 搜索 "符号" - 选上服务器 | 加载所有符号, 之后符号就会显示完全
- 【Qt开发】解决Qt程序在Linux下无法输入中文的办法
解决Qt程序在Linux下无法输入中文的办法 一位网友问我如何在Linux的Qt的应用程序中输入中文,我一开始觉得不是什么问题,但是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...
- Linux 中C/C++ search path(头文件搜索路径)
https://blog.csdn.net/BjarneCpp/article/details/76135980 起因 我拿到了一套Linux下的C++代码,代码中有这个头文件#include < ...
随机推荐
- 剑指offer 13:调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 法一: public clas ...
- vue文档阅读笔记——计算属性和侦听器
页面链接:https://cn.vuejs.org/v2/guide/computed.html 注意点 计算属性用于 替代模板内的表达式. 如果计算属性所依赖的属性未更新,会返回自身的缓存. 侦听器 ...
- 《Spring技术内幕》读书笔记
简介: 1.spring 与unix.window这些操作在计算机系统中起到的作用是类似的 2.两大核心模块:IOC\AOP 3.为应用开发提供了许多现成的系统组件:事务处理.Web MV.JDBC. ...
- leecode第二百三十七题(删除链表中的节点)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- nrf52832板子焊接后总结的经验
将之前打的nrf52832的板子拿到手了,经过一番焊接和调试后,发现了一些问题,因为是第一次画板焊接调试,很多地方做的不好,现在将自己的一些经验总结如下: 1 在制板之前,丝印层有必要好好的检查,建议 ...
- Effective java 系列之更优雅的关闭资源-try-with-resources
背景: 在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在 ...
- 开发者的自测利器-Hprof命令(寻找cpu热点)
测试代码: public class HProfTest { public void slowMethod() { try { Thread.sleep(1000); } catch (Excepti ...
- Python 考试练习
1.算法复杂度分为:时间复杂度和空间复杂度 一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量. 时间复杂度:是指执行算法所需要的计算工作量,也即算法的执行时间 (注意:是算法的执 ...
- linux基础命令连接命令ln
ln -s /etc/issue /tmp/issue.soft 创建文件/etc/issue 的软连接/tmp/issue.soft 不带-s 生成硬链接文件. 软连接类似于windows的 ...
- input表单验证
1.屏蔽输入法(只是不能输入中文还可以输入特殊字符)<input style="ime-mode:disabled" onkeydown="if(event.key ...