CMake如何包含头文件以便可以使用尖括号?

4
我正在尝试为MIT JOS操作系统项目使用CMake - http://repo.or.cz/mit-jos.git/treehttps://pdos.csail.mit.edu/6.828/2016/jos.git 以下是文件目录结构:
lab
- .bochsrc
- CODING
- GNUmakefile
- boot
- conf
- fs
- grade.sh
+ inc
    - assert.h
    - elf.h
    - error.h
    - kbdreg.h
    - memlayout.h
    - mmu.h
    - stab.h
    - stdarg.h
    - stdio.h
    - string.h
    - types.h
    - x86.h
- kern
- lib
- mergedep.pl
- user
- CMakeLists.txt

位于lab文件夹下(即项目文件夹)的CMakeLists.txt看起来像这样:

    cmake_minimum_required(VERSION 3.6)
    project(lab)

    set(CMAKE_CXX_STANDARD 11)

    set(SOURCE_FILES
            boot/main.c
            fs/test.c
            kern/console.c
            kern/console.h
            kern/entrypgdir.c
            kern/init.c
            kern/kdebug.c
            kern/kdebug.h
            kern/monitor.c
            kern/monitor.h
            kern/printf.c
            lib/printfmt.c
            lib/readline.c
            lib/string.c
            user/sendpage.c)

    add_executable(lab ${SOURCE_FILES})

我该如何包含位于inc目录下的头文件,以便源文件仍然可以使用#include <inc/types.h>等方式来包含它们,而不是使用#include "../inc/types.h"


从您的文件夹树来看,我猜想创建它的人希望您将inc添加为包含文件夹,并使用#include <mmu.h>而不是#include <inc/mmu.h> - at-2500
1个回答

7

看起来你需要为目标添加一个include目录,使用target_include_directories命令,在你的CMakeLists.txt文件末尾添加如下代码:

target_include_directories(lab PRIVATE ${CMAKE_SOURCE_DIR} )

关于在使用#include时使用尖括号和引号的区别,一般情况下你只会使用尖括号来包含“系统”头文件(例如C/C++标准头文件),而使用引号来包含用户提供的头文件(参见 #include <filename>与#include"filename"之间有何不同?)。

我尝试在lab目录下的CMakeLists.txt末尾添加target_include_directories(lab PRIVATE inc)。但我仍然看到相同类型的错误fatal error: 'inc/mmu.h' file not found #include <inc/mmu.h>。我需要在inc目录下添加一个CMakeLists.txt吗?如果需要,它应该包含什么? - srgsanky
2
@srgsanky:这是根源目录(在您的情况下为lab),其中头文件可以被引用为inc/mmu.h。因此,您需要包含此目录,而不是使用原始目录。方法如下:target_include_directories(lab PRIVATE ${CMAKE_SOURCE_DIR}) - Tsyvarev
3
我不同意你对 ""<> 的区分。使用 <> 来包含非系统头文件也很常见,尤其是当你有一个包含库公共API的一组头文件的库时。然后,你可以将公共头文件放在一个名为 include 的文件夹中,并使用 target_include_directories(mylib PUBLIC include) 命令,这样 include 文件夹就会自动转发给任何链接到你的库的人。 - at-2500
感谢@Tsyvarev和MuertoExcobito,将target_include_directories(lab PRIVATE $ {CMAKE_SOURCE_DIR})添加到CMake文件的末尾解决了问题。现在CLion没有显示错误了。 - srgsanky

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