zoukankan      html  css  js  c++  java
  • MacOS平台下@rpath在动态链接库中的应用

    一、背景介绍

          公司开发的一个底层库被用在了Mac平台的多个产品中。在开发这个底层库的初期,对于Mac OSX下的Install name 并没有过多的了解。对于XCode中的install name项也没有进行过多的配置,于是生成动态库文件在应用到各个产品中时都要修改install name才能用。后来在使用到CUDA库时,偶然发现了@rpath这个东西在CUDA动态库中被广泛使用。于是就好好研究了下@rpath的一些应用场景。

         

    二、@executable_path、@loader_path、@rpath的对比

         (1)@executable_path。这个path很少用,本质上就是可执行程序的路径。在动态库中基本上不使用这个path.

           (2) @loader_path。这个path在之前的应用中用的非常多,可以通过这个path来设置动态库的install path name。但是它有自己的局限性,就是当一个动态库同时被多个程序引用时,如果位置不一样的话仍然需要手动修改。这个在参考链接中有说明。  

     

           (3) @rpath。这个就是今天要介绍的重点,它是run path的缩写。本质上它不是一个明确的path,甚至可以说它不是一个path。它只是一个变量,或者叫占位符。这个变量通过XCode中的run path选项设置值,或者通过install_name_tool的-add_rpath设置值。设置好run path之后,所有的@rpath都会被替换掉。此外,run path是可以设置多个值的,这样看来就和Windows下的PATH变量差不多了。run path指定的多个值就可可以完美解决掉参考链接中说的问题了。

    三、使用方法 

    (1)在XCode中设置

      在编译动态链接库文件(*.dylib)时,应当将install name设置为@rpath/library.dylib。

      这样编译出来的*.dylib文件的install name如下:

      在其他程序中使用这个动态库时,需要设置好run path。打开XCode的Build Settings,直接搜索"runpath":

      

       这里的runpath是可以设置多个值的,其作用如前述所说。这样就可以彻底替代前面的设置path的方式,摆脱对具体路径的依赖。用这种方式生成的动态库也具备较好的适应性,在多种应用场景下也能自如使用。

    (2)命令行中设置

       如果不打算在XCode中使用,而是使用Makefile来组织工程的,那么使用install_tool_name也是可以的。在编译链接动态库链接库时,注意添加如下选项:

    $(CC) -dynamiclib -o $@ $+ $(LIBRARIES) $(CFLAGS) -framework opencl -install_name @rpath/libinsvmedia.dylib
    

       这样也能在链接阶段对动态链接库的install name进行修改。不过在其他程序引用这个动态链接库时,相应的也要使用install_tool_name来添加runpath了。

    install_name_tool [-change old new] ... [-rpath old new] ... [-add_rpath new] ... [-delete_rpath old] ... [-id name] input

    (3)从比较@executable_path, @loader_path, @rpath来看,@rpath是最具灵活性的,也是Apple官方最推崇的方式。

    四、参考链接

  • 相关阅读:
    三、MyCat主要配置介绍
    二、mycat15种分片规则
    一、mycat介绍
    SpringBoot使用JdbcTemplate批量保存
    linux发布常用命令
    ROS 系统架构及概念
    ROS 在 Ubuntu 18.04 安装
    利用 Skywalking 搭建 APM(应用性能管理)— 安装与配置
    elasticsearch 集群搭建及启动常见错误
    Git 基本操作
  • 原文地址:https://www.cnblogs.com/csuftzzk/p/mac_run_path.html
Copyright © 2011-2022 走看看