3

A是一个模块项目。有一些测试目标,相关的可重用代码编译在一个单独的(静态库)目标中。A使用第三方 Lumberjack 日志库。Lumberjack 代码被简单地放入项目中。

B是一个不同的模块项目,但除此之外它具有与A.

C是主要项目。这取决于ABA它链接和的库B

编译C将导致重复的 Lumberjack 符号。

我怎样才能拥有多个单独的模块项目,以便...

  1. 他们彼此不认识,
  2. 使用相同的第三方代码,
  3. 可以自己编译和测试,
  4. 包含在没有重复问题的主要项目中?
4

7 回答 7

2

因此,为了详细说明 sergio 的答案,我能够成功地构建一个测试设置,如下所示。

  1. 我将 Lumberjack 代码包含在一个单独的项目中,该项目将 Lumberjack 构建为静态库。
  2. 我使用静态库目标ModuleA和测试应用程序目标DemoA创建了一个新项目ProjectA。我将 Lumberjack 项目文件夹复制到ProjectA的项目文件夹中,然后将其添加为子项目。我没有让ModuleA依赖于 Lumberjack 或在ModuleA中链接 Lumberjack 。相反,我让DemoA依赖于两者并链接了这两个库。这样,我可以编译测试目标,但库目标不包括 Lumberjack。
  3. 我创建了第二个项目ProjectB,其模拟设置为ProjectA
  4. 在主项目中,我将ProjectAProjectB和 Lumberjack 作为子项目。不幸的是,这将使 Lumberjack 在主项目中包含 3 次,这有点不方便和丑陋(例如在选择依赖目标时,您无法真正分辨出哪个是哪个)。
  5. 最后,我使主项目的目标依赖于 Lumberjack、ModuleAModuleB并链接所有三个库。现在,主项目可以编译没有重复符号错误,子模块也可以自己编译和测试。
于 2013-10-11T11:38:07.557 回答
1

您是否尝试过查看库ar?如果你很幸运,例如跑步

ar -t libA.a

给你一个文件列表,比如

__.SYMDEF SORTED
Afile1.o
Afile2.o
Lumberjack1.o
Lumberjack2.o
Afile3.o
SomeOtherLibrary.o

伐木工人文件与其他文件明显分开的地方。然后,您可以将它们踢出去

a -d Lumberjack1.o Lumberjack2.o

并在单独C测试时使用完整库时链接到这个修剪过的库。A

于 2013-10-11T05:34:02.970 回答
1

由于您的目标是 OSX,因此您的问题的解决方案是将 Lumberjack 构建为一个框架(而不是链接 A 和 B 模块中的源代码),然后在需要的任何地方使用该框架(即,在任何使用 A 或B 模块)。

事实上,Lumberjack 已经包含一个将构建 Lumberjack.framework 的项目,请检查:CocoaLumberjack/Xcode/LumberjackFramework/Desktop/Lumberjack.xcodeproj.

详细说明这一点,您将像现在一样定义 A 和 B 模块,但不会将 Lumberjack 源代码放入其中。相反,您所做的是,每当您想在可执行文件(例如,您的测试目标)中使用 A 静态库时,将该库添加到目标以及 lumberjack 框架(就像您使用 OSX SDK 框架一样)。

如果需要,添加动态框架只是“删除源”的另一种方式,但要正确完成。

当您想在 C 项目中同时使用A 和 B 时,将静态库和 Lumberjack 框架都添加到 C 中。

如您所见,这种做法将符合您的所有四个要求,但会引入一个依赖项:您需要在静态库文档中明确说明它们依赖于 Lumberjack 框架。这实际上不是一个大问题,因为后者可以在自己的项目中使用,任何人都可以自己构建它。

如果您想改进此依赖项的处理,cocoapods 是您的最佳选择(cocoapod 是与您的库关联的文件,用于描述其依赖项,因此当您安装库时,cocoapods 系统也会自动安装依赖项) . 但这是高度可选的。一个单一的依赖关系不是一个需要记录或遵守的大问题。

希望这能回答你的问题。

于 2013-10-11T08:57:44.427 回答
1

我讨厌引用现有的答案,但这是一个麻烦但有效的解决方案:解决 Objective-C 命名空间冲突的最佳方法是什么?

我有同样的问题,不过我正在寻找更好的解决方案。另一个可能可行但我不确定如何实现它的想法我在这里问过:Selectively loading classes in Objective-C

由于有人对我的问题所说的话,我的第三个想法是将其中一个库包装在一个框架中并创建引用您需要的函数的函数。然后使用#import之类的东西加载<myFramework/MFMyAliases.h>

于 2013-10-08T19:00:05.280 回答
1

几个月前我试图实现同样的目标,“跨 iPhone 应用程序轻松、模块化的代码共享:静态库和跨项目引用”一文得到了我所需要的一切。请检查它是否有用。

于 2013-10-11T09:15:27.223 回答
0

Are A and B binaries?

If not you could simply uncheck the compile checkbox for all *.m files of one of the projects, so as to avoid building duplicate objects.

Also if you could use A and B thorough Cocoapods it would be best.

于 2013-10-09T04:53:20.100 回答
-1

试试这个

它在不同项目之间共享库/模块。

于 2013-10-10T12:16:54.253 回答