CMake 和子文件夹中的头文件问题

Posted

技术标签:

【中文标题】CMake 和子文件夹中的头文件问题【英文标题】:CMake and issues with header files in subfolders 【发布时间】:2021-01-04 08:43:56 【问题描述】:

我正在尝试建立一个项目,其中子文件夹库 src 代码以及使用 Cmake 的*** src 代码可以找到头文件。目前我收到一条错误消息,指出找不到头文件。我的项目结构如下:

root/
    src/           
        CMakeLists.txt     #(top level)  
        main.c     
        lib/
            lib1.c
            CMakeLists.txt     #(lower level)
            headers/
                lib1.h
    build/       

我的*** CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 3.13.4)

project(CmakeTUT_Proj) 

add_executable($PROJECT_NAME main.c)

target_include_directories($PROJECT_NAME PUBLIC Lib/headers/)
                                                          
add_subdirectory(Lib/)

target_link_directories($PROJECT_NAME PRIVATE Lib/headers/)

target_link_libraries($PROJECT_NAME name_of_lib) 

我的较低级别的 CMakeLists.txt 看起来像:

add_library(name_of_lib  adder.c)

我的 main.c 和我的 lib1.c 程序包含库为 #include "lib1.h",cmake 运行良好,没有任何错误,但是当我使用 make 构建项目时,我收到如下错误:

root/src/Lib/lib1.c:2:10: fatal error: lib1.h: No such file or directory
#include "lib1.h"

我想构建我的项目,以便 main.c 和 lib1.c 可以访问 lib1.h。有任何想法吗?谢谢。

【问题讨论】:

想想target_include_directories($PROJECT_NAME PUBLIC Lib/)...头文件真的在Lib吗? @Someprogrammerdude 我的错,这是一个错字,它仍然不能像这样工作 我冒昧地编辑了您的项目结构的描述,希望它更容易理解。 add_library(name_of_lib - 没有 name_of_lib 库。 target_link_directories 缺少 )。编译lib1.c时是否将headers目录添加到搜索路径中? 【参考方案1】:

顾名思义,target_include_directories 只影响一个目标。因此,当您设置target_include_directories($PROJECT_NAME PUBLIC Lib/headers/) 时,这会添加到名为$PROJECT_NAME 的可执行目标的包含路径中,但不会添加到库name_of_lib 的包含路径中。

要解决此问题,您可以在较低级别的CMakeLists.txt 中添加库的包含路径:

target_include_directories(name_of_lib PUBLIC headers)

作为奖励,因为它是PUBLIC,所以这条路径也会自动添加到任何依赖于name_of_lib 的目标中。所以在顶层CMakeLists.txt,你可以去掉这行:

target_include_directories($PROJECT_NAME PUBLIC Lib/headers/)

除此之外,这条线看起来没什么用,可能也可以删除:

target_link_directories($PROJECT_NAME PRIVATE Lib/headers/)

链接库通常不放在头文件目录中。

【讨论】:

以上是关于CMake 和子文件夹中的头文件问题的主要内容,如果未能解决你的问题,请参考以下文章

CMake GoogleTests 在我的测试文件中找不到导入的头文件

CMake第三课--安装自己编写的头文件和共享库

在CMake项目中带有前缀的头文件

CMake configure_file没有源代码构建

cmake与make的项目构建快速上手

CMAKE设置INSTALL工程,分别设置头文件Lib和DLL的输出路径