【问题标题】:OS X: convert .dylib to .a/.o (dynamic to static)?OS X:将 .dylib 转换为 .a/.o(动态到静态)?
【发布时间】:2012-08-21 20:21:12
【问题描述】:

假设我已经阅读了this caveat,并且我仍然想将 TBB 用作静态链接库。 (假设我在 an environment 工作,不允许用户创建自己的 dylib。)但我真的不想重写 TBB makefile 来生成 libtbb.a 而不是 libtbb.dylib。

有没有简单的命令行方式将 libtbb.dylib 转换为具有相同入口点的 libtbb.o?

我听到了一个很好的论据,说不能从静态到动态的其他方式。即:动态库需要是PIC,将非PIC静态库转换为PIC是不可行的。但据我所知,这个论点并不适用于另一个方向。

Here's 有人说在 Windows 上将 .dll 转换为 .a 是不可能的,但我认为他们只是在谈论将 .dll 或 .exe 破解为原始 .o 文件的可能性,不一定说不可能创建具有相同内容的可链接 .o 文件。另外,Windows 上的情况是 slightly odder than "real" PIC,尽管我认为这无关紧要。

【问题讨论】:

    标签: ios static-libraries dylib tbb dynamic-library


    【解决方案1】:

    英特尔线程构建模块 (TBB) 是 available as binary,适用于 Windows、Mac 和 Linux。如果您希望在 iOS 上使用 Mac 发行版中的 libtbb.dylib,那么您就不走运了。 Mac 发行版面向 Intel(32 位和 64 位)。由于 iOS 在 ARM 处理器上运行,因此即使您找到了将动态库转换为静态库的方法,您也无法使用它。

    如果您在其他地方找到了针对 ARM 的 libtbb.dylib 文件,那么您可能可以在 iOS 上使用它。实际上可以在 iOS 上加载动态库。查看dlopen(3) 手册页。

    最后,您应该阅读 Grand Central Dispatch (GCD),它是内置的支持在 iOS 和 OS X 的多核硬件上并发代码执行。

    【讨论】:

    • 赞成 GCD 参考。仅此一项就值得赏金:)
    • @JavierSoto:我有 99% 的把握 dlopen 在 iOS 上不起作用(尽管只是为了增加混乱,我认为有办法让它在模拟器中工作)。我听说 Apple 希望应用程序简单且独立,并避免 App Store 中出现 DLL 地狱的理由。如果有人在 iOS 应用中成功使用了 dylib,请发表评论。
    • 是的,dlopen 确实适用于 iOS。您不能使用 Xcode 轻松创建 dylib,但可以在命令行上使用 clang 创建它们。
    • 我的第一条评论是对 Javier Soto 的回复。在 iOS 上动态加载代码肯定也适用于设备。我有一个项目,其中捆绑了-[NSBundle load],我很确定最终会调用dlopen。 (此项目尚未提交到 App Store。)捆绑包或 dylib 中的代码必须使用与应用程序相同的配置文件进行签名。我认为 Apple 对动态库的关注不是 DLL 地狱,而是​​下载和执行代码的安全隐患。
    • @Quuxplusone 也许设计不应该关心哪个线程运行哪个任务? GCD 提供的抽象通过考虑队列并忘记底层线程来提供很多简单性......
    猜你喜欢
    • 2013-05-14
    • 2017-09-22
    • 2011-02-16
    • 1970-01-01
    • 2017-08-01
    • 2013-06-24
    • 1970-01-01
    • 2013-08-19
    • 2011-02-04
    相关资源
    最近更新 更多