2017-05-23 179 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,禁用該選項就是答案,但是當我第一次閱讀它時,我並沒有意識到它也適用於我的情況。