2013-10-09 68 views
0

我正在尝试使用cmake,但我对cmake和C++都是新手。我想要在其他不同的程序中使用一段代码。该文件夹结构是这样的:cmake,关于include_directories的说明

/modules/foo 
/modules/foo/src 
/modules/foo/include/foo 
/cmake 
/apps/bar 
/apps/bar/src 
/apps/bar/include 

我的问题是,在酒吧主我可以包括(和编译和运行)既

#include "foo.h" 
#include "foo/foo.h" 

我觉得这是一种症状,什么是错。 我正在寻找的是类似

#include "foo.h" // only inside the foo source code 

#include "foo/foo.h" // outside 

如果我从/modules/foo/CMakeLists.txt删除include_directories(include/foo)我得到一个编译错误,即在/模块“foo.h中”找不到文件 /foo/src/foo.cpp

而如果我从FindFoo.cmake删除include_directories(${CMAKE_CURRENT_LIST_DIR}/../modules/foo/include)我得到“富/ foo.h中”错误文件找不到 /apps/bar/src/main.cpp

我该怎么办?解决这类问题的常见做法是什么?我是否必须忽略apps/bar/src/main.cpp中包含foo.hfoo/foo.h的事实?我是否必须在foo.cpp中只写include_directories一次并使用#include "foo/foo.h

+1

IMO使用src和include目录时,将src应包含完全相同的源(的.cpp)文件和包括应包含头文件(.h),其中头通常有子目录结构。为什么你在源文件夹中有foo.h(/modules/foo/src/foo.h)?分离头文件和源文件的优点是能够只运送头文件(即包括目录)以供其他项目使用。 – Ralf

+0

对不起,错误。我还没有习惯去思考这些结构,我很关心那些不同的包括,源,cmakelists等。 – nkint

+0

这实际上是关于你的个人喜好,你如何构建你的项目。如果您愿意,您的源代码和头文件可以位于同一个目录中,具有分离的主要优点。 – Ralf

回答

1
  • 用foo.h和foo.cpp创建一个单独的目录foo。在foo.cpp中输入#include "foo.h",可能首先包含
  • 添加一个CMakeLists.txt文件来创建一个foo库,add_library命令。
  • 在主要的CMakeLists.txt
  • 序言添加include_directories(${CMAKE_SOURCE_DIR})从其他地方的项目,可以通过指定#include "foo/foo.h"包括你的foo.h中。无论您如何操作,请不要忘记使用target_link_libraries命令与foo库链接。

珍贵链接:http://www.cmake.org/cmake/help/v2.8.11/cmake.html#section_Commands

+0

好的,所以在同一目录..但为什么很多Cpp库具有结构:'mylib/include/mylib'和'mylib/src'? – nkint

+0

@nkint正如有人已经说过,这是一个品味的问题,关于你正在做的事情的背景:如果你正在编写这个子库,并且你将成为使用这个子库的人,我建议你保留和标题并汇集在一起​​。如果这是一个要作为二进制文件分发的库,则可能需要在包含目录中放入包含该接口的头文件。再次,这是一个品味的问题,你会看到许多可能的动机检查这个和相关:http:// stackoverflow。COM /问题/ 13967296 /为什么就地报头-IN-A-单独目录 – Antonio