CMake和子文件夹中的头文件问题
我正在尝试设置一个项目,其中头文件可以通过子文件夹库src代码以及使用Cmake的顶层src代码找到。目前,我收到一个错误,说明无法找到头文件。我的项目结构如下所示:CMake和子文件夹中的头文件问题,c,cmake,C,Cmake,我正在尝试设置一个项目,其中头文件可以通过子文件夹库src代码以及使用Cmake的顶层src代码找到。目前,我收到一个错误,说明无法找到头文件。我的项目结构如下所示: root/ src/ CMakeLists.txt #(top level) main.c lib/ lib1.c CMakeLists.txt #(lower level)
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
时是否将标题
目录添加到搜索路径中?