我的应用程序需要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上工作得很好。如果我能使用我在雪豹上运送的图书馆。
答案 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
(如果它不在当前目录中,则使用完整路径) - 我强烈建议您路径,它会减少头痛。