无法创建适用于OS X 10.5(在10.6环境中构建)的分发的dylib

时间:2011-08-23 18:39:30

标签: macos gcc cairo homebrew dylib

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

我假设要解决此问题,我希望它使用/Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib中的dylib而不是/usr/X11/lib中的库。我已经尝试过针对10.5 SDK定位cairo的任何内容。

  • 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
  • -sysroot / -isysroot /Developer/SDKs/MacOSX10.5.sdk添加到cairo的Homebrew公式中的CFLAGSCXXFLAGSLDFLAGS
  • -I$(SDKROOT)/usr/X11/include-I$(SDKROOT)/usr/X11R6/include添加到cairo的Homebrew公式中的CFLAGSCXXFLAGS
  • -L$(SDKROOT)/usr/X11/lib-L$(SDKROOT)/usr/X11R6/lib添加到cairo的Homebrew公式中的LDFLAGS

在构建cairo时,它在gcc命令上有-I/usr/X11/lib(我的选项在末尾添加了),所以我想它首先击中了它。我不知道如何摆脱它,所以它使用我的选项。我认为isysroot会这样做,因此包含和库路径在SDK中被重新连接,但-isysroot似乎没有任何效果。

1 个答案:

答案 0 :(得分:1)

您应该可以使用install_name_tool来更改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.dylib而不是/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/以确保脚本可以找到库。