我的项目中有一个子项目(静态库)。
由于这个静态库可能被一堆应用程序使用,我在我的项目中有这个包含app配置的config.h文件。静态库必须读取它。
问题在于添加
#import "config.h"
静态库上的失败,因为找不到该文件。
我可以在搜索标题上添加我的项目根目录的绝对路径,但是我想让它不是硬编码的,因为这个静态库将被其他项目使用。另一个问题是我不能使用像.. / ..这样的相对链接,因为静态库在另一个卷上。
在静态库的搜索路径中包含$(SRCROOT)将为我提供该库的根,而不是使用它的项目,这就是我想要的。
我该如何解决?
请注意我的问题。我在一个项目使用的静态库中。 Config.h就在项目中。我想在我的静态库中导入config.h。
如果有一种简单的方法,请告诉我。
我已将示例项目上传到 here 和 here ,这样您就可以看到我的痛苦。
感谢
答案 0 :(得分:0)
一种方法,有点像黑客,是将运行脚本添加到每个应用程序的构建阶段,作为第一项,并将其复制到Config.h一些已知的地方 - /tmp/Config.h,你所包含的库将在那里寻找它。由于文件是在每次构建时复制的,因此它总是正确的。
EDIT1:不是很漂亮,但你可以在库中的Dependencies下添加一个Run Build Script。只需添加一个并保留复选框以显示环境变量。你可以看到这一套:
file_list中= /卷/数据/用户/ dhoerl /库/开发商/ Xcode中/ DerivedData / MyProject的-fdzaatzqtmrnzubseakedvxmsgul /建造/中间体/ MyStaticLibrary.build /调试-的iPhoneOS / MyStaticLibrary.build /对象/ LinkFileList
你可以看到其中有几个作为当前项目文件夹的前缀:
/卷/数据/用户/ dhoerl /库/开发商/ Xcode中/ DerivedData / MyProject的 -
您可以在那里编写一些脚本来获取前缀,然后附加本地Config.h文件路径,现在您有一个Config.h头的完全限定路径,然后您可以将其复制到该位置的已知位置。图书馆。我将在xcode论坛上发帖,因为可能有更好的解决方案 - 在Xcode 3中有用。如果我得到任何实质性的回复,我会更新。
EDIT2:试试这个: 1)单击库,单击Build Phases,通过点击右下角的“+”按钮添加Run Script Build阶段
2)拖动它以使其成为列表中的第二项(目标依赖项下方)
3)将Shell更改为“/ bin / ksh”
4)在编辑之后将其粘贴到具有正确的文件/路径:
# Get the Project Name (assumes upper/lower/numbers only in name)
PROJ=$(echo $BUILD_DIR | sed -En -e 's/(\/.*\/)([A-Za-z0-9]+)-([a-z]+\/Build\/Products)/\2/p')
# Use this variable to construct a full path
FULL_PATH="/Volumes/Data/Users/dhoerl/Downloads/nightmare/"$PROJ"/"$PROJ"/HelloWorldLayer.h"
echo FULL_PATH equals $FULL_PATH
# Make Sure MyStaticLibrary is correct
echo PROJ_DIR equals "$PROJECT_DIR/MyStaticLibrary"
cp -f "$FULL_PATH" "$PROJECT_DIR/MyStaticLibrary"
5)这假设您将库放在任何您想要的位置,但每个App项目必须具有相同的父文件夹(没有太多限制 - 我过去所做的)。
PS:当我这样做时,我通常不会包含应用程序的实际文件,但会为未在库中实例化的类创建标题。让我们称之为Foo。所以在你的库中,你有Foo.h,它有很多返回信息的方法 - 小部件的数量,一些特殊文件夹的位置,plists,数组,字典等等。这个想法是库知道如何通过这个接口获得它需要的任何东西(类单例,或者只是一个带有类方法的类.YMMV。
PSS:其他任何人都在阅读本文,创建演示项目是值得的。
答案 1 :(得分:0)
我会走另一条路。使用编译器符号将此config.h文件作为静态库的一部分来切换功能。然后在您的项目中根据您需要的功能定义这些符号。