2014-05-20 64 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变量,它不是用户友好的。至少做这样的事情:
​​