CMake如何包含头文件以便它们可以与尖括号一起使用?

srg*_*nky 4 operating-system cmake

我正在尝试将 CMake 用于 MIT JOS 操作系统项目 - http://repo.or.cz/mit-jos.git/treehttps://pdos.csail.mit.edu/6.828/2016/jos。混帐

这是目录结构

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
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txtlab的文件夹(即项目文件夹)的样子

    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})
Run Code Online (Sandbox Code Playgroud)

如何在下面包含头文件,inc以便源文件仍然可以使用#include <inc/types.h>etc. 而不是包含它们#include "../inc/types.h"

Mue*_*ito 5

听起来您需要为目标添加一个包含目录target_include_directories,例如(在 CMakeLists.txt 的末尾):

target_include_directories(lab PRIVATE ${CMAKE_SOURCE_DIR} )
Run Code Online (Sandbox Code Playgroud)

至于使用时尖括号和引号的区别#include,一般只对'系统'头文件(如C/C++标准头文件)使用尖括号,对用户提供的头文件使用引号(见#include之间的区别是什么<filename> 和 #include "filename"? )。

  • @srgsanky:它是根源目录(在您的情况下为“lab”),其中头文件可以引用为“inc/mmu.h”。因此,您需要包含此目录:“target_include_directories(lab PRIVATE ${CMAKE_SOURCE_DIR})”。 (2认同)
  • 我不同意你区分 `""` 和 `&lt;&gt;`。对非系统头文件也使用 `&lt;&gt;` 是很常见的,特别是如果你有一个包含一组头文件的库,这些头文件包含库的公共 API。然后,您将公共头文件放入名为“include”和“target_include_directories(mylib PUBLIC include)”的文件夹中,这样包含文件夹会自动转发给链接到您的库的任何人。 (2认同)