2014-05-20 87 views
1

我用CMake創建了一個包含Boost 1.55庫的XCode項目,並且遇到了一個我自己無法解決的問題。XCode #include bug - 在頭文件中找不到,但在cxx中

的包括

#include "boost/filesystem.hpp" 

只是工作在EIATHelper.cxx,但不是在頭EIATHelper.h。在標題中顯示「文件未找到」,因此構建失敗。但是這些包含程序似乎仍然有效,因爲Xcode不會在「缺少的」filesystem.hpp中定義使用的對象。

重要!當我將include和我的所有代碼放入.cxx文件時,一切正常(構建/執行)。

我添加了一個截圖,可以幫助您更好地理解問題。 (當然我沒有使用雙的#include):

xcode error message

該項目完全CMake的創建。從子頭

的CMakeLists.txt:

project(${PROJECT_NAME}) 

add_library(helper 
${PROJECT_NAME}Helper.h 
${PROJECT_NAME}Helper.cxx 
) 

set(BOOST_ROOT /Users/name/Libs/Boost/bin) 
set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED OFF) 
set(Boost_USE_STATIC_RUNTIME OFF) 
set(Boost_DEBUG ON) 

set(BOOST_INCLUDEDIR /Users/name/Libs/Boost/bin/include) 
set(BOOST_LIBRARYDIR /Users/name/Libs/Boost/bin/lib) 


find_package(Boost COMPONENTS 
    system 
    filesystem 
    log 
    log_setup 
) 

include_directories(${Boost_INCLUDE_DIRS}) 

if(NOT Boost_FOUND) 
    message("Boost was NOT found") 
endif() 


target_link_libraries(helper ${BOOST_LIBRARIES}) 

編輯:我創建了一個Eclipse的CDT4項目與CMake的,同樣的問題在這裏。在EIATHelper.h中找不到頭文件filsystem.hpp。所以我猜想我的項目設置有些問題,無論IDE如何。

+0

什麼是 「/用戶/名/利布斯/升壓/斌/包括」?你確定Boost標題在那嗎? –

+0

是的,我相信。就像我所說的那樣,只要我將代碼放在EIATHelper.cxx文件中,#include和boost中的所有代碼都可以工作!在將我的方法的包含和原型移動到EIATHelpber.h後,它說,找不到「boost/filesystem.hpp」,但仍然找到filesystem.hpp中定義的類型...所以也許它只是一個問題與Xcode? – user3655592

+0

請注意,編譯器不直接編譯頭文件。它們通過源文件間接編譯,通過'#inc'將它們引入。因此,如果你在頭文件中看到編譯錯誤,你首先需要找出哪個源文件產生錯誤。哪個'.cxx'文件在你的項目中包含'EIATHelper.h'?你需要確保他們的_all_在他們的包含路徑中有Boost目錄。 – ComicSansMS

回答

1

只是工作在EIATHelper.cxx,但不是在頭EIATHelper.h

不,不是這樣的。 EIATHelper.cxx包括EIATHelper.h,因此「頭未找到」錯誤出現 首先在EIATHelper.h,並且是一種致命錯誤 - 編譯停止而不處理EIATHelper.cxx(因此,不報告任何錯誤EIATHelper.cxx)。

我很確定錯誤在找到boost庫。一些注意事項:

  • BOOST_INCLUDEDIRBOOST_LIBRARYDIR是一個提示。如果您設置了BOOST_ROOT並且庫位於標準路徑(lib和include)中,則不需要它們。
  • 升壓是強制性的EIATHelper.{h,cxx}它更好地使用REQUIRED子選項 (你不需要檢查Boost_FOUND):

    find_package(升壓所需的系統文件系統日誌log_setup)

  • CMake的變量是大小寫敏感的,使用Boost_LIBRARIES而不是BOOST_LIBRARIES
  • 不要硬編碼BOOST_ROOT變量,它不是用戶友好的。至少做這樣的事情:
​​