2012-02-19 82 views
1

我的应用程序需要libcurl的第7版,并在Lion上正常工作,但Snow Leopard上的libcurl.dylib版本无效(我需要*前缀* MKD命令)。 (1)应用程序文件夹,(2)内容文件夹,(3)MacOS文件夹和(4)应用程序文件夹中的副本, )资源文件夹,但没有成功。甚至四个副本,每个文件夹一个。 (仍然到/ usr/lib。)强制OS X应用程序使用特定的libcurl.dylib

我也尝试在Xcode 4.2中将“Runpath Search Paths”设置为“。”,但这并没有帮助。

因此,问题1是,我如何强制我的雪豹应用程序使用包含在包中的dylib? (安装一个新的libcurl.dylib是不可能的 - 这个应用程序将进入Mac App Store。)

在实验上,我将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上工作得很好。如果只有我可以让它使用我在雪豹上运送的图书馆。

回答

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) 

要改变尤其你可能想使用@executable_path/前缀对应可执行文件的位置,您使用的install_name_tool -id new/path/libcurl.4.dylib your/copy/of/libcurl.4.dylib ID。另外,您可以用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问题。

+0

非常感谢#1。对于#2,我的问题不是关于如何获取libcurl.a,而是关于如何让所有引用的库得到解决。 我决定libcurl方法不是我想要去的。将代码切换到CFFTP,现在它在10.6和10.7上运行得非常好。 – 2012-02-20 19:14:16

+0

通过列出它们来解决依赖关系 - 没有隐式依赖关系解析,只有显式的。这通常没有问题,因为通常在配置时或通过自我报告(例如'pkgconfig')完成。 – 2012-02-21 01:55:05