2

我正在尝试将 cairo (1.10.2) 与我的应用程序一起分发。我可以使用 Homebrew 创建必要的 dylib,但它们依赖于 OS X 10.5 中不存在的其他动态库的版本(libfontconfig、libfreetype 和其他主要位于/usr/X11/lib.

我假设要解决这个问题,我希望它使用 dylibs/Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib而不是/usr/X11/lib. 我已经尝试了任何我能找到的针对 cairo 的 10.5 SDK。

  • MACOSX_DEPLOYMENT_TARGET环境变量设置为10.5(在调用brew或使用 Homebrew之前ENV
  • SDKROOT环境变量设置为“/Developer/SDKs/MacOSX10.5.sdk”(在调用brew或使用 Homebrew之前ENV
  • -mmacosx-version-min=10.5在cairo 的 Homebrew 公式中添加CFLAGSCXXFLAGSLDFLAGS
  • 在 cairo的Homebrew 公式中添加-sysroot/ 。-isysroot /Developer/SDKs/MacOSX10.5.sdkCFLAGSCXXFLAGSLDFLAGS
  • 在cairo的Homebrew 公式中添加-I$(SDKROOT)/usr/X11/include和。-I$(SDKROOT)/usr/X11R6/includeCFLAGSCXXFLAGS
  • 在 cairo的Homebrew 公式中添加-L$(SDKROOT)/usr/X11/lib和。-L$(SDKROOT)/usr/X11R6/libLDFLAGS

在构建 cairo 时,它具有-I/usr/X11/libgcc 命令(最后添加了我的选项),所以我想它首先会达到这一点。我不知道如何摆脱它,所以它使用我的选择。我认为isysroot会这样做,因此包含和库路径在 SDK 中重新植根,但-isysroot似乎没有任何效果。

4

1 回答 1

1

您应该能够使用install_name_tool来更改 cairo 查找其库的位置。(我不知道 cairo 是什么。我假设它是一个 dylib。如果不是,我对这个解决方案的信心就会大大下降。)

这是一个您应该能够适应的虚构示例。

首先,用于otool -L查看 cairo 正在使用哪些库。在本例中,我使用的是 libopencv_imgproc.2.3.1.dylib,但您将使用 cairo 库的文件名:

$ otool -L libopencv_imgproc.2.3.1.dylib 
libopencv_imgproc.2.3.1.dylib:
    lib/libopencv_imgproc.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    lib/libopencv_core.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)

然后用于install_name_tool -change更改您需要更改的任何路径。第一个参数是当前库路径,第二个是想要的库路径,第三个是库文件。我告诉它寻找libz.1.dylibin/Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib/而不是/usr/lib

$ install_name_tool -change /usr/lib/libz.1.dylib /Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib/libz.1.dylib libopencv_imgproc.2.3.1.dylib 

对需要更改其路径的每个库重复此操作。otool -L向我们展示了所做的更改:

$ otool -L libopencv_imgproc.2.3.1.dylib 
libopencv_imgproc.2.3.1.dylib:
    lib/libopencv_imgproc.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    lib/libopencv_core.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    /Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)

在我的示例中(也许在您的应用程序中),我的库希望在我的应用程序包之外的某个地方找到自己,因此我也需要使用install_name_tool -id. 我将库复制到我的应用程序包的Frameworks文件夹中,所以我告诉它去那里看:

$install_name_tool -id @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib libopencv_imgproc.2.3.1.dylib

您可以将install_name_tool调用置于运行脚本构建阶段。如果要将库复制到应用程序包的Frameworks文件夹中,则应在库名称前面加上$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/以确保脚本可以找到该库。

于 2011-08-24T04:47:47.190 回答