探讨CMake中关于RPATH的使用

最近研究CMake,发现CMake对于RPATH的管理也非常人性化。官方说法是当动态库的编译也和执行档在同级目录下的时候,CMake会自动给执行档加入适当的RPATH.具体可以通过readelf -d executable来查看相关的RPATH路径。所以有的时候用QMake编译之后还得手动加一把LD_LIBRARY_PATH,而用CMake编译之后,直接执行执行档就可以了。

相关rpath的说明,同学可以自行google学习,简单来说,RPATH就是在LD_LIBRARY_PATH之前,会优先让执行档去寻找相应的动态库,当然了有的操作系统支持RUNPATH的话,会在RUNPATH设置情况下自动忽略RPATH,而会先去寻找LD_LIBRARY_PATH之后再去着RUNPATH,(注意这里面的顺序关系,RUNPATH在LD_LIBRARY_PATH之后,而其会让RPATH忽略,但RPATH却在LD_LIBRARY_PATH之前),相关顺序这里简单交代下: RPATH   --   LD_LIBRARY_PATH -- RUNPATH(出现会屏蔽RPATH) -- /etc/ld.so.conf -- builtin dircetories(/lib, /usr/lib)。

在这里我主要介绍下CMake对于RPATH的相关管控。默认行为已经在第一段说明了,那就是CMake在默认情况下是会给你的exe加入相关RPATH的,这个时候可能会有不想要相关RPATH的需求,仔细查阅寻找之后发现,CMake里面维护了3个比较重要的RPATH变量,即CMAKE_SKIP_RPATH,CMAKE_SKIP_BUILD_RPATH,CMKAE_INSTALL_RPATH.

对于第一个变量CMAKE_SKIP_RPATH,简单的来说,就是强制CMake不在构建期间和安装install期间给你加上它所认为的RPATH.

cmake .. -DCMAKE_SKIP_RPATH=TRUE

第二个和第三个变量也比较简单,就是分别在构建期间和安装期间不允许CMake给你加入相关RPATH

cmake .. -DCMAKE_SKIP_BUILD_RPATH=TRUE
cmake .. -DCMAKE_SKIP_INSTALL_RPATH=TRUE

当然了,如果你之后想要追加RPATH,只需要对这三个变量设置成FALSE就可以了。

参考链接: www.cmake.org/Wiki/CMake_RPATH_handling#No_RPATH_at_all

探讨CMake中关于RPATH的使用

时间: 2024-08-08 16:53:13

探讨CMake中关于RPATH的使用的相关文章

探讨C++中的Map映射机制

概述 从MFC到ATL,充斥着Map映射机制,似乎没有了这个Map机制,就玩不转啦.在WebBrower控件中,也存在着事件映射:在COM中,在IDispatch中也存在着自定义的函数映射. 以前,只要一谈到映射机制,总是让我闻风丧胆,退而求自保,暂且如此而已,记住就可以啦.现在想来,只要是跨不去过的坎,若没有认真面对和解决,那就永远无法逾越,成为心中永远的痛.最终,只能作茧自缚而唯唯诺诺.既然老天爷,又给了我一次机会,那我就好好抓住这次机会啦. 轰轰烈烈的开场白讲完了,让我们回归主题:"映射机

1.Relationship in Entity Framework Using Code First Approach With Fluent API【使用EF Code-First方式和Fluent API来探讨EF中的关系】

In this article, you will learn about relationships in Entity Framework using the Code First Approach with Fluent API. 在这篇文章中,你将会学习到使用EF Code-First方式和Fluent API来探讨EF中的关系(一对一,一对多,多对多). Introduction[介绍] A relationship, in the context of databases, is a

深入探讨C#中的const、readonly关键字

首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不 怕了.既然说到了原理,我们还是从MSDN说起. 一:值得推敲的几个地方 1.先来看看msdn上面对const是怎么说的,我们会看到.不能修改,编译时常量这些关键性信息. Q:  const为什么不能被修改. A:这个很简单,很多教科书上面都说,当编译器编译时,会将常量的值保存在该程序集的元数据中,下面我们做个实例 看一看. ①:新建一个projectA. 代码如下: // Projec

探讨Ajax中有关readyState(状态值)和status(状态码)的问题

先看下面一段代码,然后给大家详细介绍,Ajax中有关readyState(状态值)和status(状态码)的问题,具体内容如下所示: var getXmlHttpRequest = function () { try{ //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); }catch(e){ //低版本的IE浏览器没有提供XMLHttpRequest对象,IE6以下 //所以必须使用IE浏览器的特定实现ActiveXObject ret

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用

继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). cd /home/ccj/CMakeDemo mkdir t3   cd /backup/cmake/t3 mkdir lib   在t3目录下建立CMakeLists.txt,内容如下: PRO

HelloWorld CMake Demo 03:CMake中构建静态库与动态库及其使用

? 继续完善Hello World,建立它的共享库, 包括静态库和动态库. ? 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). ? 一,准备工作: 在/home/ccj/CMakeDemo目录建立t3目录,用于存放本节涉及到的工程. cd /home/ccj/CMakeDemo mkdir t3 ? 二,建立共享库

探讨DDD中角色权限与DCI的使用

本文初衷 之前在学习DDD的时候,一直被权限与角色困扰. 我们知道在Asp.net MVC 的Controller或Action加上特性标签[Authorize],就可以实现权限控制. [Authorize(Roles ="Manager")] public class MainController : Controller { // GET: Main public ActionResult Index() { return View(); } } 但是在应用层中,如何使用好角色?在

探讨HTTP中敏感数据的安全性传输方案

通用信息 文档介绍:本文档是为了探讨提高http中的敏感数据如密码等的安全性传输方案. 修订历史:1.0 方案探讨 方案1:应用Base64 方案介绍:发送端在发送敏感数据之前,先用Base64对其进行编码,再将编码后的值传输给接收端.收端接收到该值后,用Base64对其进行解码,便可读到敏感数据的内容. 优点:Base64算法复杂度低,所以计算效率会比较高,编码后的长度增加也较少. 缺点:为了保证Webpage端的JavaScript和Webserver端的c代码能够互相编码和解码,就要求Ba

探讨迭代器中为什么不能通过集合的方式删元素而是使用迭代器中的remove()方法经行删除

由该链接引发的思考:http://bbs.itheima.com/forum.php?mod=viewthread&tid=26270&mobile=1 看到这篇文章后,一副似懂非懂的样子,果断将楼主的代码拷贝到eclipse中运行了下,果断发现了些问题. 经过测试,发现总是在当集合中倒数第二个满足条件时程序才可以正常运行,否则,就会抛出ConcurrentModificationException异常 然后,我在while{it.hasNext()){和String str = (Str