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官方最推崇的方式。

四、参考链接

posted @ 2016-09-27 22:17 24K纯开源 阅读(...) 评论(...) 编辑 收藏