【问题标题】:Xcode: How do I build my .app project also as a Shared Library?Xcode:如何将我的 .app 项目也构建为共享库?
【发布时间】:2011-07-29 02:53:13
【问题描述】:

首先我在 MAC OS X 10.6 上使用 Xcode 3.2.5

我有一个构建和运行良好的 Cocoa 应用程序项目。我在这个项目中有一些要导出的函数:

#define CORE_EXPORT __attribute__ ((visibility ("default")))

extern "C" {
    CORE_EXPORT IUIEventHandler* GetIUIEventHandler();  
}

如果我希望另一个动态库项目能够链接到我的原始 Cocoa 应用程序,以便它可以使用导出的 GetIUIEventHandler 函数,我需要做什么?

我还需要将原始 Cocoa 应用程序构建为动态库吗?或者有没有办法链接可可应用程序的可执行文件?

【问题讨论】:

    标签: xcode cocoa attributes visibility dynamic-library


    【解决方案1】:

    单个 Xcode 项目由多个目标组成。每个目标生产一个产品。产品类似于应用程序或共享库。

    项目中的每个文件可以属于零个或多个目标,但通常属于一个。

    我会重新组织您的项目,使其具有两个目标,一个是共享库或框架,另一个是应用程序。

    您最终可能会在框架中使用大量通用代码,而在应用程序中只有非常特定于应用程序的概念。这通常具有澄清代码的副作用,并有助于维护一些良好的抽象。许多项目都是以这种方式构建的,即使该框架仅由一个客户使用,这样他们就可以从它引导您实现的更简洁的设计中受益。

    【讨论】:

    • 因此,如果我将一个 BSD 动态库目标添加到我的原始 Cocoas 应用程序并将相同的代码文件拖入其中,我可以拥有一个可以链接到其他库但访问 GetIUIEventHandler() 函数的库来自最初的 Cocoas 应用程序? GetIUIEventHandler() 返回一个在原始 Cocoas 应用程序中创建的全局变量。还是您建议我将 Exported 函数放入原始 Cocoa Application 和其他库项目也链接的单独库中?
    • 我不确定我是否理解您的问题,但我希望每个函数都存在于库或应用程序中,而不是两者都存在。如果您需要应用程序创建 UIEventHandler,但希望库访问它,您可能需要执行一些操作,例如提供 SetUIEventHandler() 并让应用程序尽早调用它。
    • 部分问题在于这最初是一个 windows 项目,当您在 windows 上构建时,它会构建一个匹配的 .exe 和 .lib。 Xcode 项目不这样做,但我仍然需要我的 GetIUIEventHandler 函数,该函数从应用程序中返回指向全局对象的指针,以供另一个库使用。该库将由应用程序加载的另一个库加载。我需要想要使用 GetIUIEventHandler 的库依赖于应用程序可执行文件吗?也许这不可能与 windows 的功能完全匹配?感谢您的帮助,我是 Xcod 的新手。
    • 听起来你应该在你的第一个库中拥有 GetUIEventHandler() 和 SetUIEventHandler(),从你的应用程序中调用 SetUIEventHandler(),并从你的第二个库中调用 GetUIEventHandler()。
    • 这是一种解决方案,但也许这将有助于解决我最初的问题。 Windows 上的链接器选项是导入库的 /IMPLIB,有没有办法在 Xcode 中复制它的可执行文件
    【解决方案2】:

    这个答案有点脏,但它有效。我在需要从主应用程序可执行文件中导入函数的库上使用了链接器标志 -undefined dynamic_lookup,并且我没有链接到任何包含需要导入的函数的库中。

    这迫使链接器不必担心未定义的符号,并将它们标记为在加载时应链接。当应用程序加载我使用 -undefined dynamic_lookup 构建的库时,它将链接未定义的符号本身。

    这是我找到答案的地方: http://lists.apple.com/archives/xcode-users/2008/Dec/msg00002.html

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多