Xcode:如何将我的.app项目也构建为一个共享库?

Xcode:如何将我的.app项目也构建为一个共享库?,xcode,cocoa,attributes,visibility,dynamic-library,Xcode,Cocoa,Attributes,Visibility,Dynamic Library,首先,我在MacOSX10.6上使用Xcode 3.2.5 我有一个Cocoa应用程序项目,它的构建和运行都很好。我在这个项目中有一些功能,我正在使用这些功能导出: #define CORE_EXPORT __attribute__ ((visibility ("default"))) extern "C" { CORE_EXPORT IUIEventHandler* GetIUIEventHandler(); } 如果我希望另一个动态库项目能够链接到我的原始Cocoa应用程序,

首先,我在MacOSX10.6上使用Xcode 3.2.5

我有一个Cocoa应用程序项目,它的构建和运行都很好。我在这个项目中有一些功能,我正在使用这些功能导出:

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

extern "C" {
    CORE_EXPORT IUIEventHandler* GetIUIEventHandler();  
}
如果我希望另一个动态库项目能够链接到我的原始Cocoa应用程序,以便它可以使用导出的GetIUIEventHandler函数,我需要做什么


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

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

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

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


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

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

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

这就是我找到答案的地方:

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