CMake和绝对头文件路径

13
我正在尝试使用CMake来构建我的C ++项目,但是我在头文件路径方面遇到了问题。
由于我正在使用许多组织在多个目录中的类,所有我的包含语句都是使用绝对路径(因此不需要使用“../../”),但是当尝试制作CMake生成的Makefile时,它就无法正常工作。
是否有人知道如何在CMakeLists.txt中指定所有包含文件都是使用绝对路径?
我的输出结果是:~/multiboost/BanditsLS/GenericBanditAlgorithmLS.h:45:25: Utils/Utils.h: 没有那个文件或目录 ~/multiboost/BanditsLS/GenericBanditAlgorithmLS.h:46:35: Utils/StreamTokenizer.h: 没有那个文件或目录
我的CMakeLists.txt文件:
#The following command allows the use of the "file" command
cmake_minimum_required(VERSION 2.6)  

#The declaration of the project
project(multiboost)  

#This allows recursive parsing of the source files
file(
    GLOB_RECURSE
    source_files
    *
    )  
list(REMOVE_ITEM source_files ./build/* )

#This indicates the target (the executable)  
add_executable(
    multiboost
    ${source_files} #EXCLUDE_FROM_ALL build/
    )

1
你能提供一个小的例子(源代码/头文件/CMake)吗?另外,绝对路径通常不是一个好主意。我认为最好的方法是像boost一样指定一个单独的根目录,在编译器的包含路径中从那里开始。 - stijn
是的,完全正确,这就是我正在做的事情:假设我有一个包含源代码所有子目录和主文件的src/目录。在我的所有include语句中,我只需要指定从src/开始的路径即可。 在我的XCode项目中,它可以正常工作,但我还没有弄清楚如何在CMake中实现。(感谢您的回答;o)) - Archy
是的,但我们仍需要一个示例和更多信息(“它只是不起作用”就像错误描述一样神秘,根本没有告诉我们任何东西)。 - stijn
注意:不要使用通配符来构建文件列表。手动指定它非常重要,因为这会强制你在添加/删除文件时修改CMakeLists.txt,从而在运行make时强制cmake重新运行。如果不这样做,新添加或删除的文件将无法被捕获,导致程序出错。 - Jack Kelly
2个回答

18
你需要在CMakeLists.txt中添加类似以下的内容:
SET(BASEPATH "${CMAKE_SOURCE_DIR}")
INCLUDE_DIRECTORIES("${BASEPATH}")

太棒了!我觉得这正是缺少的东西(BASEPATH变量) 谢谢fschmitt! - Archy

6

设置正确的包含路径:假设您的Utils目录在/exp/appstat/benbou/multiboost中,那么cmake(实际上是gcc)必须知道这一点:

include_directories( /exp/appstat/benbou/multiboost )

或者更方便的做法是将其作为一个选项传递到命令行上:
include_directories( ${MyProjectRoot} )

cmake -DMyProjectRoot=/exp/appstat/benbou/multiboost    

1
感谢 stjin。顺便说一下,CMake配置文件必须是平台无关的,可以使用一些 IF 语句来完成。祝好运! - Archy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接