6

我有一个由应用程序链接到的静态库。库代码打开应用程序包中的包中的文件,打开方式如下:

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];

这工作正常。

但是我想在库中添加一些单元测试代码,所以我有一个逻辑测试目标。由于该文件位于应用程序的捆绑包中,而不是静态库的捆绑包中,因此我复制了该Config.plist文件并将其添加到测试代码目标中Copy Bundle Resources。但是,当我执行测试代码时,找不到该文件。这是为什么?

由于上述内容令人困惑,这里是工作区结构的摘要。

Workspace contains:
    Application Project with application target, which contains (X)
        Config.plist (a)
    Library project which contains:
        Library target, which contains:
            the code opening the file in the bundle (b)
        Test library target, which contains: (Y)
            A Copy of the Config.plist (c)

因此,如果我构建 X,那么当 b 运行时它可以找到 a。但是当我在运行时构建 Y 时,b 找不到 c。

4

3 回答 3

11

我发现如果我将 [Bundle mainBundle] 更改为 [NSBundle bundleForClass:[self class]] 那么它在这两种情况下都有效

于 2013-05-01T14:05:41.567 回答
0

您可以在项目库中创建一个应用程序目标,将该文件复制到该目标,然后创建一个应用程序测试目标(在同一个项目中),您可以在其中测试您的库代码。

于 2013-05-01T00:44:09.440 回答
0

问题是静态库没有捆绑资源。编译后,它将仅包含已编译的代码和头文件。因此没有要复制的静态库 plist 资源。

因此,您需要另一个过程来复制库包,使其最终位于构建目录中。

我发现最有效的方法是在 Link Binary With Libraries 阶段之前的运行脚本阶段使用脚本执行此操作。我附上了我的一个项目的截图,我不得不做类似的事情。您应该能够通过调整脚本第一行的文件名来实现您所需要的。所有环境变量都预定义为标准,所以我认为除了这个脚本之外不需要任何进一步的配置。

不过,尚未测试环境变量是否适用于默认 xCode 4 构建位置以外的任何内容。

将资源从静态库复制到父项目构建目录的脚本

于 2013-05-01T01:04:49.557 回答