强制OS X应用程序使用特定的libcurl.dylib

时间:2012-02-19 21:29:03

标签: xcode macos cocoa libcurl dylib

我的应用程序需要libcurl的第7版,并且在Lion上运行正常,但Snow Leopard上的libcurl.dylib版本不起作用(我的* MKD命令需要*前缀)。

我尝试了各种方法在我的软件包中包含Lion版本的libcurl.dylib,包括在(1)app文件夹,(2)Contents文件夹,(3)MacOS文件夹和(4)中添加副本Resources文件夹,没有成功。甚至四个副本,每个文件夹一个。 (仍然转到/ usr / lib。)

我也尝试将Xcode 4.2中的“Runpath搜索路径”设置为“。”,但这没有帮助。

所以,问题#1是,如何在Snow Leopard上强制我的应用程序使用我在包中包含的dylib? (安装新的libcurl.dylib是不可能的 - 这个应用程序将进入Mac App Store。)

在实验上,我使用Lion中的文件替换了我的Snow Leopard系统上的/usr/lib/libcurl.dylib,并且应用程序正常运行。所以我知道,如果我可以让应用程序使用这个库,它将正常工作。

我还尝试构建一个静态libcurl.a,它运行(使用configure,make和make install),但在尝试链接时,应用程序仍然引用了dylib。然后我将静态库的名称更改为libcurl-static.a,但随后出现了链接器错误,因为其他dylib中未定义了许多符号。我试图在我的构建中包含更多dylib,以解决这些问题,但libcurl所需的dylib列表显然很长。我尝试使用otool来找出所需的内容,但没有一个选项向我展示任何有用的东西。

问题#2是:如何将我的应用程序与libcurl静态链接?

(我有一个解决方法,因为无法使用* MKD,如果目录已经存在,它会忽略错误,但它涉及太多额外的FTP操作并且效率低下。我使用* MKD的方法工作正常,而且速度很快。)

我不需要建议我去另一个FTP库,因为我已经想到了这一点。真的不想,因为libcurl在Lion上工作得很好。如果我能使用我在雪豹上运送的图书馆。

1 个答案:

答案 0 :(得分:0)

1)您必须更改库的ID(在链接之前) - 默认情况下,它将指向/usr/lib/,而不是您发货的地方。请参阅otool -L

$ otool -L /usr/lib/libcurl.4.dylib  | head -n 2
/usr/lib/libcurl.4.dylib:
    /usr/lib/libcurl.4.dylib (compatibility version 6.0.0, current version 6.1.0)

要更改您使用的ID install_name_tool -id new/path/libcurl.4.dylib your/copy/of/libcurl.4.dylib,您可能希望使用与您的可执行文件位置对应的@executable_path/前缀。或者,您可以使用install_name_tool -change /usr/lib/libcurl.4.dylib @executable_path/libcurl.4.dylib yourapp

更改已编译二进制文件中的路径

2)您使用库名强制静态链接,而不是-lcurl而是使用libcurl.a(如果它不在当前目录中,则使用完整路径) - 我强烈建议您路径,它会减少头痛。

PS:我不确定你是否可以合法地发布Apple的libcurl(你可能,我不知道) - 但是很容易从Apple的源代码直接为SL编译它,这可以避免任何Lion问题。