2017-05-23 127 views
0

在Xcode(8.3.2)中创建新的库项目,选择Framework:STL(C++ Library),类型:Static,并将其命名为“MyLibrary”。您将获得开始文件MyLibrary.hpp,MyLibraryPriv.hpp,MyLibrary.cpp。创建新的头文件semaphore.h,将它放在与所有其他文件夹相同的文件夹中。这个文件应该有一个包含防护定义semaphore_h包含不包含静态lib项目的用户路径的路径

加入MyLibrary.cpp下面几行:

#include <semaphore.h> 

#ifdef _BSD_SEMAPHORE_H 
#warning _BSD_SEMAPHORE_H 
#endif 

#ifdef semaphore_h 
#warning semaphore_h 
#endif 

我在这里包括系统头文件,我只是说不是文件,而是构建的结果是semaphore_h将被写成建立警告,这是错误的。如果我在Finder中重命名我的文件,则应该如此编写_BSD_SEMAPHORE_H

这是一个错误?如何解决它?我的项目中有一个与系统标题共享相同名称的标题,但我宁愿不更改名称。

奇怪的是,如果它是一个应用程序项目(命令行工具),那么它会按预期工作。 #include <semaphore.h>会导致_BSD_SEMAPHORE_H警告,#include "semaphore.h"会导致semaphore_h警告。库项目的行为与应用程序项目不同。

回答

0

为了回答我自己的问题,这是一个扩展到Xcode 4并可能超越的bug。对于静态库,应禁用构建选项USE_HEADERMAP(项目设置>搜索路径>使用头部映射>设置为)。那么在同名的头文件之间不应该有冲突。

该选项不会导致应用程序出现问题,但它明显用于past。还有一个SO question,禁用该选项就是答案,但是当我第一次阅读它时,我并没有意识到它也适用于我的情况。