【问题标题】:How to change the Library path in CMake MAC OSX?如何更改 CMake MAC OSX 中的库路径?
【发布时间】:2015-04-30 16:05:55
【问题描述】:

我的尝试

我正在使用 MAC OSX 中的 Caffe 模型工作示例应用程序。我从 https://github.com/BVLC/caffe 下载了 Caffe 源代码。 步骤:

1.安装了caffe的依赖包,如Caffe Link中所述。一些软件包在 /usr/local/lib 和一些软件包 /opt/local/lib

2.在 CMake GUI 中使用 CMakeLists.txt 构建共享库(SO)文件。

3.创建示例c++应用程序

4.用c++应用链接所有依赖和caffe库文件。

  1. 构建应用程序

我执行应用程序后,它需要来自/usr/local/lib

的依赖包的库文件

我想要什么

安装caffe依赖后,我将所有库文件复制到另一个位置。

如何在Cmake.中链接库的指定位置文件?

在 Mac osx 中,当应用程序运行时,它采用库形式 /usr/local/lib 不在当前文件夹(应用程序文件夹)中。

如何设置应用程序从当前文件夹获取库文件?

【问题讨论】:

  • 这些caffe依赖是动态库吗(有.dylib后缀)?
  • 我的理解是,在 OSX 中,动态库会标有它们的路径,因此当您构建应用程序时,它会在该位置进行搜索。您可以使用 install_name_tool 更改它,但您希望在构建之前执行此操作,否则应用程序会在错误的位置查找。
  • 现在我想起来了,mac 使用 .so 文件吗?我以为它只是做了 .dylib...
  • 感谢您的回答。所有动态库扩展都有 .dylib。我试过“install_name_tool”。但我没有得到它。提供使用“install_name_tool”更改库路径的示例。?

标签: c++ macos cmake


【解决方案1】:

这是我用来制作 OSX 应用程序的 makefile 中的命令(名称已更改以保护无辜者):

install_name_tool -id "@executable_path/../Resources/libMyLib.dylib" ./libMyLib.dylib

您也可以只在命令行上运行install_name_tool

-id 之后的第一个参数是您想要的目标(包括库的名称),第二个参数是库的当前路径——即二进制文件本身。在此示例中,库与 makefile 位于同一文件夹中。

然后,在我构建应用程序之后(链接器将在您构建的二进制文件中包含这个指向所需库的新路径)我将库复制到 Resources 文件夹:

cp ./libMyLib.dylib App.app/Contents/Resources/

在 OSX 中,@executable_path 是您实际二进制文件所在的目录。应用程序的打包方式如下: App.app/Contents/MacOS/App。在App.app/Contents 中还有一个名为Resources 的文件夹,如果我不希望用户自己安装依赖项,我通常会在此处存放依赖项。因此,在这种情况下,@executable_path/../Resources 是从应用程序的二进制文件到 dylib 所在位置的相对路径。

您可以使用install_name_tool 将库放在您想要的任何位置。我只是觉得这是一个很好的地方。

顺便说一句,你可以用otool -L查看当前库的id是什么。可能,如果你运行

> otool -L caffe.dylib

它会返回类似/usr/local/lib 的东西,即使你把它移到别的地方。尝试用install_name_tool -id 更改id,然后再次运行otool -L,看看会发生什么。在这一点上应该是有意义的。

【讨论】:

  • 这是一个很好的答案;令人惊讶的是,这些信息被隐藏在网上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多