Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake和子文件夹中的头文件问题_C_Cmake - Fatal编程技术网

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

CMake和子文件夹中的头文件问题,c,cmake,C,Cmake,我正在尝试设置一个项目,其中头文件可以通过子文件夹库src代码以及使用Cmake的顶层src代码找到。目前,我收到一个错误,说明无法找到头文件。我的项目结构如下所示: root/ src/ CMakeLists.txt #(top level) main.c lib/ lib1.c CMakeLists.txt #(lower level)

我正在尝试设置一个项目,其中头文件可以通过子文件夹库src代码以及使用Cmake的顶层src代码找到。目前,我收到一个错误,说明无法找到头文件。我的项目结构如下所示:

root/
    src/           
        CMakeLists.txt     #(top level)  
        main.c     
        lib/
            lib1.c
            CMakeLists.txt     #(lower level)
            headers/
                lib1.h
    build/       
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如下所示:

root/
    src/           
        CMakeLists.txt     #(top level)  
        main.c     
        lib/
            lib1.c
            CMakeLists.txt     #(lower level)
            headers/
                lib1.h
    build/       
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\u include\u目录
只影响一个目标。因此,当您设置
target\u include\u目录(${PROJECT\u NAME}PUBLIC Lib/headers/)
时,这将添加到名为
${PROJECT\u NAME}
的可执行目标的include路径,而不是库的include路径

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

target_include_directories(name_of_lib PUBLIC headers)
另外,由于它是
公共的
,因此该路径也会自动添加到依赖于
库的
名称的任何目标。因此,在顶级
CMakeLists.txt
中,您可以删除这一行:

target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/)

除此之外,这一行看起来没用,也可能被删除:

target_link_directories(${PROJECT_NAME} PRIVATE Lib/headers/)

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

顾名思义,
target\u include\u目录只影响一个目标。因此,当您设置
target\u include\u目录(${PROJECT\u NAME}PUBLIC Lib/headers/)
时,这将添加到名为
${PROJECT\u NAME}
的可执行目标的include路径,而不是库的include路径

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

target_include_directories(name_of_lib PUBLIC headers)
另外,由于它是
公共的
,因此该路径也会自动添加到依赖于
库的
名称的任何目标。因此,在顶级
CMakeLists.txt
中,您可以删除这一行:

target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/)

除此之外,这一行看起来没用,也可能被删除:

target_link_directories(${PROJECT_NAME} PRIVATE Lib/headers/)

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

考虑一下
target\u include\u目录(${PROJECT\u NAME}PUBLIC Lib/)
。。。头文件真的在
Lib
中吗?@Someprogrammerdude我的错,这是一个输入错误,它仍然不能这样工作。我已经冒昧地编辑了项目结构的描述,希望它更容易理解。
add\u library(库的名称
-库中没有
库的名称
目标链接目录
缺少一个
。编译
lib1.c
时是否将
标题
目录添加到搜索路径中?想想
目标包含目录(${PROJECT\u name}PUBLIC lib/)
…头文件真的在
Lib
中吗?@Someprogrammerdude我的错,那是一个打字错误,它仍然不能这样工作。我已经冒昧地编辑了项目结构的描述,希望更容易理解。
添加库(库的名称
-库中没有
库的名称。
目标链接目录
缺少一个
。编译
lib1.c
时是否将
标题
目录添加到搜索路径中?