CMake 和绝对标题路径

Posted

技术标签:

【中文标题】CMake 和绝对标题路径【英文标题】:CMake and absolute header paths 【发布时间】:2011-04-18 03:55:57 【问题描述】:

我正在尝试使用 CMake 构建我的 C++ 项目,但我在标头路径中遇到了问题。

由于我使用了许多在多个目录中组织的类,因此我所有的包含语句都使用绝对路径(因此无需使用“../../”)但是当尝试制作 CMake 生成的 Makefile 时它只是不起作用。

有谁知道如何在 CMakeLists.txt 中指定所有包含都使用绝对路径?


我尝试制作时的输出

~/multiboost/BanditsLS/GenericBanditAlgorithmLS.h:45:25: Utils/Utils.h: No such file or directory ~/multiboost/BanditsLS/GenericBanditAlgorithmLS.h:46:35: Utils/StreamTokenizer.h: No such file or directory

我的 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/
    )

【问题讨论】:

你能提供一个小例子吗(source/header/cmake)?此外,绝对路径通常不是一个好主意。最好的方法是 imo 例如 boost 这样做的方式:指定一个位于编译器包含路径中的单个根,然后从那里开始。 是的,这就是我正在做的事情:假设我有一个 src/ 目录,其中包含源文件的所有子目录以及主文件。在我所有的包含语句中,我只需要指定来自 src/ 的路径。在我的 XCode 项目中,它运行良好,但我还没有弄清楚如何在 CMake 中制作它。 (感谢您的回答;o)) 是的,但我们仍然需要一个示例 + 更多信息(“它只是不起作用”就像错误描述一样神秘,根本没有告诉我们任何事情) 旁白:不要使用 glob 来构建文件列表。手动指定。这很重要,因为它会在您添加/删除文件时强制您修改CMakeLists.txt,在您运行make 时强制cmake 重新运行。如果您不这样做,新的或删除的文件将不会被拾取,从而导致损坏。 【参考方案1】:

你在 CMakeLists.txt 中需要这样的东西:

SET(BASEPATH "$CMAKE_SOURCE_DIR")
INCLUDE_DIRECTORIES("$BASEPATH")

【讨论】:

不错!我认为这正是缺少的(BASEPATH var)谢谢 fschmitt!【参考方案2】:

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

include_directories( /exp/appstat/benbou/multiboost )

或者将其作为选项传递给命令行可能更方便:

include_directories( $MyProjectRoot )

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

【讨论】:

谢谢 stjin。顺便说一句,CMake 配置文件必须独立于平台,可以使用 IF 语句来完成。祝你好运!

以上是关于CMake 和绝对标题路径的主要内容,如果未能解决你的问题,请参考以下文章

[cmake][转载]add_subdirectory详解

Cmake包含系统和程序文件的路径

CMake 和 CPack。配置文件中的安装路径

NetBeans 6.9、CMake 和 C++:如何指定构建路径?

CMake 在错误的路径上查找库

从 QMake 到 CMake。 (不同的路径级别)