在 XCode 中静态链接 OpenSSL

2024-04-30

我正在尝试链接libssl.a and libcrypto.aXCode 命令行项目中的静态库 [在 Link Binary With Libraries 下]。我已在搜索路径中包含 Openssl 头文件。

编译成功但执行失败dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib.

当我静态链接它时,为什么它会查找 dylib?如何解决这个问题?

任何帮助将不胜感激。


当我静态链接它时,为什么它会查找 dylib?如何解决这个问题?

Apple 的链接器使用 dylib 或共享对象(如果可用),无论您的链接器标志如何,例如-rpath and -Bstatic。他们甚至在 iOS 上做到了这一点,而 dylib 是不允许的!

一旦你了解了它,它就是一个众所周知的问题:) 例如,参见,在 Mac OS X 上安装 Crypto++ 5.6.2 https://stackoverflow.com/a/25733194/608639。 Crypto++ 与苹果的工具也有同样的问题。

解决方法是stop using -L and -l选项,并直接链接目标文件或存档。存档只是目标文件的集合,因此您可以互换使用它们。

要指定链接器的目标文件或存档,请参阅链接到目标文件 http://www.cocoabuilder.com/archive/xcode/264949-linking-to-an-object-file.html。在 Xcode 下,您添加完全指定的存档名称(例如/usr/local/openssl-ios/lib/libcrypto.a) to 其他链接器标志 (the OTHER_LDFLAGS https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.htmlXcode 选项)。

将完整存档添加到时OTHER_LDFLAGS,我相信你只是逐字添加它without任何开关,例如-l or -L. You may need -Wl (-Wl,/usr/local/openssl-ios/lib/libcrypto.a), 但是你don't use -l (-l/usr/local/openssl-ios/lib/libcrypto.a).

You use -Wl当选项通过编译器驱动程序传递到链接器时。如果直接调用链接器,则不需要-Wl并且不应该使用它。


第二个选项是设置GCC_LINK_WITH_DYNAMIC_LIBRARIES to YES。苹果似乎没有在其中记录它Xcode 构建设置参考 https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html,但它显然位于我的 Xcode 副本下。看如何链接 iOS 的静态库 https://stackoverflow.com/q/11064984/608639在堆栈溢出上。

我似乎记得过去曾遇到过这个问题。这是理论上应该起作用但在实践中不起作用的事情之一。


第三个选项是从 Xcode 下使用的所有路径中删除 dylib 或共享对象,以便 Xcode 在使用时不会意外找到它-lcrypto.


第四个选项是使用允许动态链接,但执行程序DYLD_LIBRARY_PATH https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html。它的 OS X 相当于LD_LIBRARY_PATH,并确保加载您的 OpenSSL 副本(如 1.0.2),而不是系统版本的 OpenSSL (0.9.8)。

但我不喜欢这个选项,因为它要求你的软件的用户做一些事情。


另一种可能性是由于消息dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib是对您的库副本进行代码签名。它找到了但没有加载,这有点奇怪,所以我要把它扔掉,以防它的 OS X代码签名 https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html or 网守服务 https://support.apple.com/en-us/HT202491...

要在 MAC Developer 程序下对库副本进行代码签名,只需:

codesign -fs "Johnny Developer" /usr/local/ssl/lib/libcrypto.so
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XCode 中静态链接 OpenSSL 的相关文章

随机推荐

  • 访问单个结构体成员是否会将整个结构体拉入缓存?

    我一直在读乌尔里希 德雷珀的书 每个程序员都应该了解的内存知识 http lwn net Articles 250967 并在部分3 3 2 缓存效果的测量 http lwn net Articles 252125 页面中间 它给我的印象是
  • 在 TFS 构建过程中运行 WatiN 测试时出现超时问题

    我已经在我的开发环境中运行了一个简单的 WatiN Web 测试 并尝试让它在 TFS 构建服务器上运行 尝试加载页面时失败 但出现以下异常 WatiN Core Exceptions TimeoutException Internet E
  • 在 spring mvc 环境中使用查询使用 ajax 调用的结果填充列表框选项。

    目前 我正在处理我的第一个 jquery ajax 调用 并且在如何将服务器端结果填充到我的列表框中时遇到问题 spring 控制器正确地返回数据 希望如此 我只是在填充列表框时遇到了 jquery 部分的问题 这是我的 ajax 调用 f
  • 注销后重定向设备

    在用户注销后 使用 Devise 将用户重定向回当前所在页面的最佳做法是什么 The 设计文档 https github com plataformatec devise wiki How To 3a Change the redirect
  • 使用 CSV 文件填充下拉列表 - d3

    我想在 html 中填充简单的下拉列表 使用 csv 文件中存在的值 我尝试类似的方法 但它不起作用
  • 如何检查用户是否从“设置”返回

    我正在向我的用户发送本地通知 并且我想在通知设置按钮上显示相关标题 如果本地通知关闭 则此标题应为 通知 关闭 如果本地通知打开 则此标题应类似于 首选项 现在我正在 viewDidLoad 和 viewDidAppear 中检查它 它有效
  • 递归和迭代的速度性能 – 为什么它们对于不同的“小”数都以相同的速度运行?

    我正在尝试优化我拥有的代码 为了做到这一点 我编写了这段代码来查看递归与迭代的效果 该代码 计数 到 10 的 n 次方 public Form1 InitializeComponent Stopwatch sw new Stopwatch
  • 设置 datetime-local 的默认时间值

    我使用这个 html 标签作为日期时间选择器
  • Cocoa 自动布局约束 - 以编程方式填充可变数量的视图

    我希望能够向超级视图添加新视图 但使它们彼此之间保持恒定的垂直距离 为此 我尝试以编程方式为每个视图设置约束 但我不知道如何做到这一点 问题是我事先不知道视图的数量或相对位置 有没有一种方法可以以编程方式为每个视图设置约束 以便无论它们相邻
  • 将 geom_path 和 geom_text 添加到同一 ggplot 会在 r 中生成错误

    我正在同一个 ggplot 中绘制 geom path 对象和 geom text 对象 但遇到以下问题 load the data frames df1 lt data frame x c 32 42 52 y c 15 20 25 gr
  • 在 C# 中的 RESTfull/HTTP 请求中添加标头和发布数据

    我在 C 中发送 POST 请求时遇到问题 似乎我误解了一些 HTTP 基础知识 所以基本上我正在实施 RESTfull 服务client 其工作原理如下 使用用户名 密码发出 POST 请求并获取令牌 在发出其他 GET POST PUT
  • RemoteViews 支持的方法

    我正在尝试将值转发到 Android RemoteView 某些值可以通过使用反射的 set 方法转发 例如背景颜色的工作原理 rv setInt R id viewId setBackgroundColor 0xffff0000 尽管该机
  • 如何在 JavaScript 中将随机对象文本插入到 DOM 中?

    我正在为表单输入字段制作自定义类包装器 这些字段内部包含 DOM 节点 并通过额外的功能方法进行增强 我的问题是是否有与 toString 类似的方法用于附加到 DOM 因为我想直接将对象插入到 DOM 而不是调用其他方法 换句话说 这是我
  • Django 可重用应用程序配置

    我有一些连接到数据库的 Django 中间件代码 我想将中间件变成可重用的应用程序 app 这样我就可以将其打包以分发到许多其他项目中 而无需复制和粘贴 我不明白可重用应用程序应该在哪里配置自身 由于它是用于重新分发的 所以我无法自己编写中
  • Python:从自定义域发送电子邮件

    我正在尝试从 Python 中的自定义域发送电子邮件 我已经弄清楚如何使用 smtplib 从其他域 例如 gmail com 发送电子邮件 示例代码 https stackoverflow com questions 57842922 c
  • 我们可以从 MFCC 系数中恢复音频吗?

    可以从 MFCC 系数中获取音频信号吗 另外 MFCC 系数是否有一个值范围 如果有的话 是什么 如果没有 如何将其归一化在 0 到 1 之间 我尝试使用以下 MATLAB 代码 http labrosa ee columbia edu m
  • 如何在代码中使用毕加索设置背景图像

    我知道毕加索将图像加载到 imageview 等中 但如何使用毕加索设置布局背景图像 My code public class MainActivity extends ActionBarActivity Override protecte
  • 在 dplyr::filter 中传递字符串作为变量名

    我使用 mtcars 数据集来说明我的问题 例如 我想将数据子集到 4 缸汽车 我可以这样做 mtcars gt filter cyl 4 在我的工作中 我需要传递一个字符串变量作为我的列名 例如 var lt cyl mtcars gt
  • 在 C# 中将字符串转换为类型[重复]

    这个问题在这里已经有答案了 如果我收到一个包含类名称的字符串 并且我想将该字符串转换为真实类型 字符串中的类型 我该怎么做 I tried Type GetType System Int32 例如 它似乎有效 但是当我尝试使用自己的对象时
  • 在 XCode 中静态链接 OpenSSL

    我正在尝试链接libssl a and libcrypto aXCode 命令行项目中的静态库 在 Link Binary With Libraries 下 我已在搜索路径中包含 Openssl 头文件 编译成功但执行失败dyld Libr