首页 > 解决方案 > CMake 和子文件夹中的头文件问题

问题描述

我正在尝试建立一个项目,其中子文件夹库 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 程序包含库 as #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。有任何想法吗?谢谢你。

标签: ccmake

解决方案


顾名思义,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/)

链接库通常不放在 headers 目录中。


推荐阅读